黄巾之乱-服务器线程控制



我有一个场景:

有N个线程,它们一起执行,等到N个线程执行完成后,有一个A线程执行。

A线程执行完成后,N个线程又一起冲出来,同时执行。  这样周而复始。

(N线程的个数未知,它们的个数可能随时都在变化)


我想要这种结果:

N1线程
N2线程
N3线程
A 线程
------------------
N3线程
N1线程
N2线程
N4线程
A 线程
--------------------
N1线程
N2线程
A 线程
--------------------



之前使用了MS的读写锁来实现,但总觉得不够清晰,自己用代码来实现了:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Threading;
using System.Collections.Concurrent;
using System.Diagnostics;

namespace threadcontrol
{ 
    public partial class Form1 : Form
    {

        static ConcurrentDictionary<int, bool> dict_done = new ConcurrentDictionary<int, bool>();

        

        public Form1()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;         

                    
            Thread aThread = new Thread(new ThreadStart(princess));            
            aThread.Start();
            
        }


        private void button1_Click(object sender, EventArgs e)
        {          
            Thread nThread = new Thread(new ThreadStart(dwarf));
            nThread.Start();
        }



        private void dwarf()
        {

            int hashid = Thread.CurrentThread.ManagedThreadId;

            dict_done.TryAdd(hashid, false);

            while (true)
            {

                if (dict_done[hashid]) { Thread.Sleep(100); }
                else {                    
                        //do something
                        listBox1.Items.Insert(0, "dwarf");

                        dict_done[hashid] = true;
                      }
            }
        }



        private void princess()
        {
            while (true)
            {
                if (!all_done()) { Thread.Sleep(100); } //有人没完成
                else { //全部完成
                    
                    Thread.Sleep(1000);
                    listBox1.Items.Insert(0, "--------------princess  " + dict_done.Count.ToString());

                    set_kong();//全部读线程初始
                    }
            }
        }





        public bool all_done()
        {
           bool tmp = true;

           foreach (var key in dict_done.Keys)
                {
                    if (dict_done[key] == false) { tmp = false; break; }
                }
            return tmp;
        }


        public void set_kong()        
        {         
            foreach (var key in dict_done.Keys)
            {
                dict_done[key] = false;
            }
          
        }  



    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘欣的博客

你将成为第一个打赏博主的人!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值