创建线程需要时间。
如果有不同的小任务要完成,就可以事先创建许多线程,在应完成这些任务时发出请求。
这个线程数最好在需要更多的线程时增加,在需要释放资源时减少。
不需要自己创建线程池,系统已经有一个ThreadPool类管理线程。
这个类会在需要时增减池中线程的线程数,直到达到最大的线程数。池中的最大线程数时可配置的。
在双核CPU中,默认设置为1023个工作线程和1000个I/O 线程(文件等)。 也可以指定在创建线程池时应立即启动的最小线程数,以及线程池中可用的最大线程数。
如果有更多的作业要处理,线程池中线程的个数也到了极限,最新的作业就要排队,且必须等待线程完成其任务。
核心:
ThreadPool.QueueUserWorkItem(ThreadMethod);
将要执行的小任务放入到线程队列Queue中。
注意事项:
1、线程池创建的线程默认都是后台线程(前台线程一结束,就把后台线程都kill)。
2、如果进程的所有前台线程都结束了,所有的后台线程就会停止。
3、不能把入池的线程改为前台线程。
4、不能给入池的线程设置优先级或者名称。
5、入池的线程只能用于时间较短的任务(小任务)。
6、如果线程要一直运行(如word的拼写检查器线程),就应使用Thread类创建一个线程。
static void Main(string[] args)
{
// 接受一个方法,然后ThreadPool会找一个空白线程去执行我们的任务。
ThreadPool.QueueUserWorkItem(ThreadMethod);
// 加入线程序列的方法,必须带一个参数。
// 开启多个任务:
ThreadPool.QueueUserWorkItem(ThreadMethod);
ThreadPool.QueueUserWorkItem(ThreadMethod);
ThreadPool.QueueUserWorkItem(ThreadMethod);
ThreadPool.QueueUserWorkItem(ThreadMethod);
ThreadPool.QueueUserWorkItem(ThreadMethod);
ThreadPool.QueueUserWorkItem(ThreadMethod);
Console.ReadKey(); // 必须加上这句:因为开启的全是后台线程,如果不加上,那么,程序将直接关掉。
}
static void ThreadMethod(object state)
{
Console.WriteLine("线程开始..." + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(2000);
Console.WriteLine("线程结束。" + Thread.CurrentThread.ManagedThreadId);
}