一共有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);
}
}
}
}
[解决办法]
线程池已经帮你做了这个东西吧 设置线程池的属性就可以了
[解决办法]