命题:一共有N个线程,可以同时M个线程并发(M<N)。
当前实现:下面程序的实现是一开始就new并start了N个线程,然后利用Mutex控制只有M个线程同时运行。这样非常消耗资源,因为有N-M个线程虽然没有运行,但都start了。
期望做到:能不能做到,如果只有M个线程并发,就只start M个线程?而不是一开始就start N个线程?以此减少线程资源的消耗。using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;namespace ConsoleApplication2
{
    public class MutexControl
    {
        private const int THREAD_NUM = 50; //一共需要运行的线程数
        private const int MAX_RUNTHREAD = 6; //可同时执行的最大线程数
        //private AutoResetEvent[] event = null;        //这个变量仅为了测试当前运行的线程数
        private static int testThreadNum = 0;        private Mutex[] muxConsole = null;        public MutexControl() 
        {
            muxConsole = new Mutex[MAX_RUNTHREAD];
            for (int i = 0; i < MAX_RUNTHREAD; i++)
            {
                muxConsole[i] = new Mutex();
                //event[i] = new AutoResetEvent(false);
            }
        }        public void ApplySync()
        {
            //创建指定数量的线程
            //是线程调用Run方法
            //启动线程
            for (int i = 0; i < THREAD_NUM; i++)
            {                
                Thread trd = new Thread(new ParameterizedThreadStart(DoWork));
                
                trd.Name = "Thread" + i;
                trd.Start();
                Console.WriteLine("已启动的线程:" + trd.Name);            }
        }        //Thread execute main method.
        public void DoWork(object o)
        {
            try
            {
                String currentThreadName = Thread.CurrentThread.Name;
                int currentThreadID = System.Convert.ToInt32(currentThreadName.Substring(6).Trim());
                int muxNo = currentThreadID % MAX_RUNTHREAD;
                //当前线程申请互斥量
                muxConsole[muxNo].WaitOne();                //Console.WriteLine("Thread_ID: " + currentThreadID);
                //这句仅为了测试当前队列中的线程数量
                Interlocked.Increment(ref testThreadNum);
                Console.WriteLine("Thread_Name: " + Thread.CurrentThread.Name + " 允许运行");
                
                //这句要替换成实际的线程运行的内容
                Thread.Sleep(5000);                //当前线程运行完毕后释放互斥量
                muxConsole[muxNo].ReleaseMutex();                //这句仅为了测试当前队列中的线程数量
                Interlocked.Decrement(ref testThreadNum);
            }
            catch (AbandonedMutexException ame)
            {
                Console.WriteLine(Thread.CurrentThread.Name + " AbandoneMutexException: " + ame);
            }
        }
    }
}