命题:一共有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);
}
}
}
}
当前实现:下面程序的实现是一开始就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);
}
}
}
}
同意。建议lz读一下msdn:http://msdn.microsoft.com/zh-cn/library/system.threading.threadpool(v=vs.80).aspx