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

原创 2015年05月23日 23:09:32


我有一个场景:

有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;
            }
          
        }  



    }
}





版权声明:本文为博主原创文章,未经博主允许不得转载。

HP-Socket国产优秀socket通信组件推荐

* HP-Socket 官方网站:http://www.jessma.org * HP-Socket 项目主页:http://www.oschina.net/p/hp-socket * HP-Sock...
  • clb929
  • clb929
  • 2016年04月07日 16:18
  • 17420

新游戏发布《三国记黄巾之乱》—新引擎预热

一,关于引擎: 《三国记黄巾之乱》是用鄙人新开发的flash脚本引擎LegendForFlashProgramming0.1制作而成,该引擎完全脱离光荣原版引擎,关于新引擎的下载和使用方法, 请看...

oracle 数据备份服务器安装 之乱码篇

服务器:win2003系统 数据库:oracle10.2.1 forwindows32 参考文献: 解決EXP-00091的方法:http://www.blogjava.net/nobody...

关于PL2303型号命名之乱

转自:http://www.360doc.com/content/13/0916/16/6973384_314860320.shtml 使用PL2303这款芯片制作USB转串口时,相信很多人对PL2...

移植之乱谈

昨天有一个博友回复,说他已经完成了android系统在windows上的移植,其中比较难的是binder系统的移植。下面是两个demo网址,我看了后倍有感触。http://v.youku.com/v_...
  • Innost
  • Innost
  • 2011年11月10日 07:34
  • 6666

【转】移植之乱谈 深入理解Android 卷I作者谈

昨天有一个博友回复,说他已经完成了android系统在windows上的移植,其中比较难的是binder系统的移植。下面是两个demo网址,我看了后倍有感触。 http://v.youk...
  • ilvu999
  • ilvu999
  • 2012年09月03日 23:57
  • 483

风控之乱:零经验者,跳槽3次,年薪50万 2016-10-20 20:06 来源:一本财经(yibencaijing) 本文经授权转载!感谢原作者的辛勤创作! 金融的核心是什么? 严谨的金融从业者,

风控之乱:零经验者,跳槽3次,年薪50万 2016-10-20 20:06 来源:一本财经(yibencaijing) 本文经授权转载!感谢原作者的辛勤创作! 金融...

Android渠道不能承受之乱

你经常在哪里下Android软件?答案可能五花八门。第九城市副总裁沈国定不久前刚刚拿到一部HTC水货手机,里面居然被刷进超过10个软件商店,谷歌官方的Android Market、安智市场、安卓市...

编译器之乱

编译器之乱在学习C语言的一年中,我用了许多工具:DEV C++,GCC,VS2017。大概两月前,我发现一件有趣的事:一模一样的代码,在VS中无法运行,却能在DEV上运行。对于这件事,我一直没怎么上心...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黄巾之乱-服务器线程控制
举报原因:
原因补充:

(最多只允许输入30个字)