关闭

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

407人阅读 评论(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
查看评论

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

一,关于引擎: 《三国记黄巾之乱》是用鄙人新开发的flash脚本引擎LegendForFlashProgramming0.1制作而成,该引擎完全脱离光荣原版引擎,关于新引擎的下载和使用方法, 请看这里http://blog.csdn.net/lufy_legend/article/details...
  • lufy_Legend
  • lufy_Legend
  • 2011-10-21 14:49
  • 16061

控制一个高消耗CPU的线程数控制方案

由于该后台服务逻辑处理较多,还有一些复杂的计算(牛顿迭代法),后台每次跑一个线程对CPU的消耗比较高,而生产环境是4个CPU8核心(记不太清),每个核上有2个实例部署,每次通过前台调用一个CPU占用率会达到百分之百。所以需要一种方案来进行线程数控制。 开发和测试耗时2周(中间有很多小插曲进来,也是...
  • xxzlhhh
  • xxzlhhh
  • 2016-11-13 22:35
  • 307

linux 网络编程之服务器多线程限制

本文讨论服务器端多线程并发的操作和限制: 基于实验结果和百度结果: 实验基础:服务器和客户端,服务器为每个客户端连接开辟线程,验证服务器多线程的最大支持数目 实验环境:ubuntu 12.04 实验结果:   1、一切系统默认设置的情况下,最多接收了381个链接,也即开启了381个线程。 ...
  • frank_jb
  • frank_jb
  • 2016-07-26 20:20
  • 2029

c#线程基础之线程控制

用ManualResetEvent和AutoResetEvent可以很好的控制线程的运行和线程之间的通信。msdn的参考为: http://msdn.microsoft.com/zh-cn/library/system.threading.autoresetevent.aspx http://msd...
  • jinjazz
  • jinjazz
  • 2008-06-20 14:01
  • 9305

控制线程执行时间

ThreadStart ts = new ThreadStart(bb);            Thread t = new Thread(ts);   &#...
  • zb219
  • zb219
  • 2009-12-28 11:25
  • 724

自己的web服务器项目-实现多线程处理(三)

自己的web服务器项目-静态请求和动态请求处理(二) 上面项目中,服务器只能接受单方的请求,不能够多用户同时访问,这明显不符合现实逻辑,那么在这里,我们将其修改为多线程的,实现多用户的访问 首先,我们实现Server类如下: package com.sapmle.server; import ...
  • suwu150
  • suwu150
  • 2016-09-10 13:54
  • 2312

(java多线程并发)控制并发线程数的Semaphore

1.简介    信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。 2.概念     Semaphore分为单值和多值两种,前者只能被一个线程获得,后者可以...
  • ZuoAnYinXiang
  • ZuoAnYinXiang
  • 2016-01-02 15:58
  • 5510

java动态控制线程的启动和停止

最近项目有这样的需求:原来系统有个计算的功能,但该功能执行时间会很长(大概需要几个小时才能完成),如果执行过程中出现了错误的话,也只能默默的等待错误执行完成才行,无法做到动态的对该功能进行停止。 我了解到项目需求后,写了如下的小例子: package com.iamzken.te...
  • zkn_CS_DN_2013
  • zkn_CS_DN_2013
  • 2016-02-23 18:08
  • 2420

python threading多线程控制和处理

Thread是threading模块中最重要的类之一,可以使用它来创建线程。有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法;另一种是创建一个threading.Thread对象,在它的初始化函数(__init__)中将可调用对象作为参数传入。下面分别举例说明。先来看看通过继承...
  • zmj_88888888
  • zmj_88888888
  • 2013-03-20 14:49
  • 1710

黄巾之乱-开发环境

 黄巾之乱: 是一款准备以中国东汉末年的历史为背景而创作的网络游戏 每个玩家以一方诸侯的角色出现在游戏世界中,不断的发展经济和军事壮大自己的势力. 玩家可以在其中修建各种建筑设施,搭建复杂的生产系统,领略真实的战争战役,体验人与人对局的魅力。 初衷: 玩过不少...
  • ot512csdn
  • ot512csdn
  • 2015-03-26 11:16
  • 426
    个人资料
    • 访问:168486次
    • 积分:1482
    • 等级:
    • 排名:千里之外
    • 原创:143篇
    • 转载:3篇
    • 译文:0篇
    • 评论:29条
    个人说明

    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
    最新评论