CLR线程池
CLR线程池
一个应用程序最多只能有一个线程池。线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率。
CLR线程池用于对.NET中线程的管理,其基本的工作方式为:
- 线程池的最开始是没有线程的,线程池有一个请求队列。
- 当应用程序请求一个线程的时候,CLR会调用某个方法,将请求放入线程池的请求队列中。
- 然后线程池会创建新的线程,将应用程序请求分配给新建的线程进行处理。
- 若线程完成应用的请求后,线程会返还至线程池中,等待新的任务请求。
- 若长时间没有新的请求,则线程会自动终结。
线程池中线程的分类:线程池中默认分为工作者线程和I/O线程。
其中工作者线程是平时用的最多的,通常用于计算密集的任务。而I/O线程则是完成向磁盘和数据库读写数据的操作。
线程池的最大值一般默认为1000。当大于此数目的请求时,将保持排队状态,直到线程池里有线程可用。
何时使用线程池?
ThreadPool 类
方法 | 说明 |
---|---|
GetMaxThreads | 同时运行的最多线程数,所有大于此数目的请求将保持排队状态,直到线程池线程变为可用 |
GetMinThreads | 在没有请求时,维护的空闲线程数 |
SetMaxThreads | 设置可以同时处于活动状态的线程池的请求数目 |
SetMinThreads | 设置线程池在新请求预测中维护的空闲线程数 |
QueueUserWorkItem | 启动线程池里得一个线程 |
GetAvailableThreads | 剩余可用的空闲线程数 |
除非有特殊需要,否则不要修改线程池中的最大线程数和空闲线程默认值。
static void Main(string[] args)
{
int Workernum = 0;
int IOnum = 0;
//前面工作者线程,后面是I/O线程
ThreadPool.GetMaxThreads(out Workernum , out IOnum );
Console.WriteLine(Workernum + " " + IOnum);
//获取剩余可用的空闲线程数
ThreadPool.GetAvailableThreads(out<