关闭

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

343人阅读 评论(0) 收藏 举报
分类:


我有一个场景:

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



    }
}





0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:130798次
    • 积分:1048
    • 等级:
    • 排名:千里之外
    • 原创:136篇
    • 转载:3篇
    • 译文:0篇
    • 评论:27条
    个人说明

    SAP-BASIS 14年
    SAP-ABAP 3年
    MFC 10年
    C# 5年

    QQ:522929
    code ability
    1999 Computer hardware、TurboC2.0
    2000 电信局端接入设备
    2001 CISCO Routers
    2002 SAP46C、BASIS
    2003 VC6++ MFC
    2004 JX外挂
    2005 ASP
    2006 JSP、AJAX、JS、MSSQL2000 (黄巾之乱第一版)
    2007 HP-UX ORACLE Reorganization
    2008 JXSJ外挂,hook API
    2009 AS3、hibernate、MSSQL2005 (黄巾之乱第二版)
    2010 AIX DB2 ECC6 BASIS
    2011 www.haoshangpin.net 淘宝客WEB
    2012 选号程序
    2013 VMware平台、京东销售联盟
    2014 ECC6EHP7 BASIS
    2015 C#、ABAP
    2016 WMS项目、EF6、FineUI、SAP BI42
    2017 UNITY2D、PDA、HP-SOCKET
    最新评论