创建线程需要时间。如果有不同的小任务需要完成,则可以事先创建许多的线程,对应完成这些任务时发生的线程请求。这个线程数最好在需要更多的线程时增加,在需要释放资源时减少。 而对应的这个线程池,不需要用户去自己创建。系统中已经有一个ThreadPool类来管理线程。 这个类会在需要时增减池中的线程的个数,直到达到最大的线程数。 池中的最大线程数是可配置的。在双核CPU中,默认设置为1023个工作线程和1000个I/O线程。也可以指定在创建线程池时,应立即启动的最小线程数,以及线程池中可用的最大线程数。 如果有更多的作业需要处理,线程池中线程的个数也到了极限,最新的作业就要排队,等待线程完成目前的任务。 线程池创建出的线程默认是后台线程。
简单来说,每新建一个线程都需要占用内存空间和其他资源,而新建的诸多线程,大部分都在在休眠,或者在等待资源释放;又有许多线程只是周期性的做一些小工作,如刷新数据等等,占有一个线程而消耗不必要的资源,实际编程中大量线程突发,然后在短时间内结束的情况很少见。 于是,就提出了线程池的概念。线程池中的线程执行完指定的方法后并不会自动消除,而是以挂起状态返回线程池,如果应用程序再次向线程池发出请求,那么处以挂起状态的线程就会被激活并执行任务,而不会创建新线程,这就节约了很多开销。只有当线程数达到最大线程数量,系统才会自动销毁线程。因此,使用线程池可以避免大量的创建和销毁的开支,具有更好的性能和稳定性,其次,开发人员把线程交给系统管理,可以集中精力处理其他任务。
class Program{ static void ThreadMethod(object state) { Console.WriteLine("线程开始:"+Thread.CurrentThread.ManagedThreadId); Thread.Sleep(2000); Console.WriteLine("线程结束"); } static void Main() { //利用线程池来开启工作线程 //如果ThreadMethod方法没有参数,下面语句会出现错误: //无法从“方法组”转换为“WaitCallBack” ThreadPool.QueueUserWorkItem(ThreadMethod); ThreadPool.QueueUserWorkItem(ThreadMethod); ThreadPool.QueueUserWorkItem(ThreadMethod); ThreadPool.QueueUserWorkItem(ThreadMethod); ThreadPool.QueueUserWorkItem(ThreadMethod); Console.ReadKey(); } } //输出为: //线程开始:12 //线程开始:13 //线程开始:14 //线程开始:15 //线程开始:16 //线程结束 //线程结束 //线程结束 //线程结束 //线程结束需要注意的是:
线程池中的所有线程都是后台线程。如果进程的所有前台线程都结束了,所有的后台线程也都会停止。不能将入池的线程改为前台线程。不能给入池的线程设置优先级或名称。入池的线程只能用于时间较短的任务。如果线程要一直运行(比如Word的拼写检查线程),就应该使用Thread类创建一个线程。