日期:2014-05-17  浏览次数:20940 次

一共有N个线程,可以同时M个线程并发(M<N)。如何实现才能有效控制资源占用?
命题:一共有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);
  }
  }
  }
}

------解决方案--------------------
线程池已经帮你做了这个东西吧 设置线程池的属性就可以了
------解决方案--------------------
探讨
线程池已经帮你做了这个东西吧 设置线程池的属性就可以了

------解决方案--------------------
哦,也可以读同一个文档的.net4.0版。http://msdn.microsoft.com/zh-cn/library/system.threading.threadpool(v=vs.100).aspx

.net4.0已经系统线程池的线程数,从25提升到1024个以上。而且有1024个以上的工作线程,外加1000个以上的IO完全端口操作线程。因此.net4.0的默认配置更强悍一些。
------解决方案--------------------