创建线程需要时间。如果有不同的小任务需要完成,就可以事先创建许多线程,在应完成这些任务的时候发出请求。这个线程数最好在需要更多的线程时增加,在需要释放资源时减少。在.NET Framework中不需要自己创建这样一个列表,该列表由ThreadPool类托管。这个类会在需要时增减线程池中的线程数,直到最大的线程数。池中的最大线程数是可以配置的。在双核CPU中,默认设置为1023个工作线程和1000个I/O线程。也可以指定在创建线程池时应立即启动的最小线程数,以及线程池中可用的最大线程数。如果有更多的作业需要处理,线程池中的线程个数达到了极限,最新的作业就要排队,且必须等待线程完成其任务。
来看下面这个示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
6:
namespace Threadpool
8: {
class Program
10: {
string[] args)
12: {
//用来保存工作线程的个数
int nWorkerThreads;
//用来保存I/O线程的个数
int nCompletionPortThreads;
//读取工作线程和I/O线程的最大线程数
out nCompletionPortThreads);
//把这些信息写入到控制台
+
,
22: nWorkerThreads,nCompletionPortThreads);
//在for循环中,调用ThreadPool.QueueUserWorkItem()方法,传递一个WaitCallback类型的委托,把JobForAThread()方法赋予线程池中的线程
//线程池收到这个请求后,就会从池中选择一个线程,来调用该方法。如果线程池还没有运行,就会创建一个线程池,并启动第一个线程。如果线程池已经在
//运行,且有一个空闲线程来完成该任务,就把该作业传递给这个线程。
int i = 0; i < 5;i++)
27: {
28: ThreadPool.QueueUserWorkItem(JobForThread);
29: }
30: Console.ReadKey();
31: }
32:
object state)
34: {
int i=0;i<3;i++)
36: {
, i, Thread.CurrentThread.ManagedThreadId);
38: Thread.Sleep(50);
39: }
40: }
41: }
42: }