我们简单创建一个例子:
static void Main(string[] args)
{
Console.WriteLine("主线程开始");
ThreadPool.QueueUserWorkItem(Run, 5);
Console.WriteLine("主线程结束");
Console.ReadKey();
}
private static void Run(object i)
{
Console.WriteLine("线程池值:" + i);
}
输出结果:

从上面我们可以看出主线程没有等待线程方法执行结束,而是继续执行。
所以可以知道线程池也是多线程类似于上一篇中的Thead中的后台线程。
为了方便理解你完全可以理解为线程池就是多线程Thread的后台线程,并做了性能优化,不只是单单创建一个线程那么简单。而是创建或调起已存在线程来执行任务;
Thread中的常用方法:
我们使用ThreadPool线程池后,我们需要对线程进行控制。1、 QueueUserWorkItem:将方法排入队列以便执行。 此方法在有线程池线程变得可用时执行。此方法存在两个参数形式QueueUserWorkItem(WaitCallback)和QueueUserWorkItem(WaitCallback,Object)第一个为把一个无参函数排入队列等待执行,第二个为有参函数排入队列等待执行;
2、 SetMaxThreads:设置可以同时处于活动状态的线程池的请求数目。即可理解为设置线程池活动线程的最大数目。
3、 SetMinThreads:发出新的请求时,在切换到管理线程创建和销毁的算法之前设置线程池按需创建的线程的最小数量。即可理解为设置线程池的最小保留数目。
在上面的方法基础上我们修改一下代码来看结果:
static void Main(string[] args)
{
Console.WriteLine("主线程开始");
ThreadPool.SetMaxThreads(5, 5);
for (int i = 0; i < 60; i++)
{
ThreadPool.QueueUserWorkItem(Run, i);
}
Console.WriteLine("主线程结束");
Console.ReadKey();
}
private static void Run(object i)
{
Console.WriteLine("当前线程池id:" + Thread.CurrentThread.ManagedThreadId.ToString());
Console.WriteLine("线程池值:" + i);
}
输出结果:
在上面的我设置最大线程池说无5个。从截图也可以看出同一个线程被重复使用了多次执行任务;如果我们使用常规的Thread线程来处理的话恐怕要开60个线程才可以,大大的浪费了资源。而在线程池中我们仅仅值需要5个。当然这俩跟我们的机器处理速度也有关系,线程池不是说设置多少个线程就一定会启用到峰值。