线程池基本理论
主要特点:
完成同一种任务的一组线程。(一般初始线程数>=64)
原理:
通过“事先创建一堆线程,并且执行完后不销毁”的方式,避免每次任务到来时,
都要创建线程的开销。
主要组成部分:
线程池管理器(ThreadPoolManager): 创建线程池
添加新任务
销毁线程池
工作线程(WorkThread): 线程池中的所有线程
任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。
任务队列(TaskQueue):用于存放没有处理的任务。提供一种缓冲机制。
基本操作:
一般情况下是首先初始化一定数量的工作线程,并把任务提交给空闲的线程,当线
程都处于忙的状态的时候,则重新生成新的工作线程,当空闲线程较多的时候则停止一
部分线程,这些要看你自己的调度算法。但是线程不能滥用,因为并不是线程越多就会
带来更好的性能,这些都要看你的具体应用,具体可以参照侯捷先生的《windows多线
程程序设计》
何时使用:
当系统需要频繁启动线程,且完成任务的时间较短时,使用线程池能有效的提高性能。
PS:之所以要强调任务的执行时间较短,是因为:如果任务执行时间很长(eg:数据库访
问),那么“节省线程对象创建时间”对提升整体性能的作用是很有限的。
优化线程池设计:
a)动态改变工作线程数量
设置好线程池的上限和下限。为应对突发访问量增加的情况,防止大量任务积压在任
务队列中,动态“批量增加工作线程”;访问量下降后可适当减少工作线程数。
eg:SqlServer单进程多线程模式,1024个数量的线程池,动态线程分配,理论上限32767。
b)优化成合适的工作线程数量
调试时,根据“统计规律”选择“预期访问频率”下,效率最高的初始工作线程数量。
c)多个线程池
根据不同任务或者任务优先级来采用不同线程池处理,一般用于复杂系统中。