读书人

C# 求线程行列

发布时间: 2012-08-15 16:57:16 作者: rapoo

C# 求线程队列
100个线程,同时只能运行3个,3个中完成一个,在剩下的线程中取一个加入运行线程队列中
求demo,求解决方案。。

[解决办法]
用semaphore

http://blog.csdn.net/aladdinty/article/details/3855524
[解决办法]

C# code
写了一个例子代码感觉使用while来扫描不是很好应该使用同步机制的using System;using System.Threading;using System.Collections.Generic;namespace ConsoleApplication1{    public class Program    {        static void Main()        {            MyThreadPool threadPool = new MyThreadPool(100, 10);            threadPool.Start();            Console.ReadKey();        }    }    /// <summary>    /// 自定义线程池    /// </summary>    public class MyThreadPool    {        /// <summary>        /// 线程队列        /// </summary>        private Queue<Thread> _ThreadQueue;        /// <summary>        /// 当前线程数        /// </summary>        private Int32 _CurThreadCount;        /// <summary>        /// 同一时间最大能运行的线程数        /// </summary>        private Int32 _MaxRunThreadNumber;        /// <summary>        /// 构造函数        /// </summary>        /// <param name="maxThreadNumber">最大线程数</param>        /// <param name="maxRunThreadNumber">同一时间最大能运行的线程数</param>        public MyThreadPool(Int32 maxThreadNumber,Int32 maxRunThreadNumber)        {            _ThreadQueue = new Queue<Thread>(maxThreadNumber);            if (maxRunThreadNumber > maxThreadNumber)            {                _MaxRunThreadNumber = maxThreadNumber;            }            else            {                _MaxRunThreadNumber = maxRunThreadNumber;            }            // 初始化线程队列            for (Int32 i = 0; i < maxThreadNumber; i++)            {                Thread t = new Thread(new ParameterizedThreadStart(Foo));                t.IsBackground = true;                t.Name = String.Format("线程{0}", i + 1);                _ThreadQueue.Enqueue(t);            }            _CurThreadCount = 0;        }        /// <summary>        /// 模拟运行工作        /// </summary>        /// <param name="threadName"></param>        private void Foo(Object threadName)        {            Random r = new Random(Guid.NewGuid().GetHashCode());            Int32 iSleep = r.Next(1, 10) * 1000;            Interlocked.Increment(ref _CurThreadCount);            Console.WriteLine(String.Format("{0} 启动,延时 {1} 毫秒, 当前运行线程数据 {2}", threadName, iSleep, _CurThreadCount));            Thread.Sleep(iSleep);            Interlocked.Decrement(ref _CurThreadCount);            Console.WriteLine(String.Format("{0} 结束", threadName));        }        /// <summary>        /// 开启线程        /// </summary>        public void Start()        {            while (true)            {                // 如果线程队列为空,则退出                if (_ThreadQueue.Count == 0)                {                    break;                }                // 如果当前运行的线程数据小于最大运行数据,就从队列里取一个线程运行                if (_CurThreadCount < _MaxRunThreadNumber)                {                    Thread t = _ThreadQueue.Dequeue();                    t.Start(t.Name);                }                Thread.Sleep(50);            }        }    }} 

读书人网 >C#

热点推荐