线程池基本理论

主要特点:
       完成同一种任务的一组线程。(一般初始线程数>=64)
 
 
 原理:
       通过“事先创建一堆线程,并且执行完后不销毁”的方式,避免每次任务到来时,
     都要创建线程的开销。

 
 主要组成部分:
       线程池管理器(ThreadPoolManager): 创建线程池
                                                           添加新任务
                                                           销毁线程池
       工作线程(WorkThread): 线程池中的所有线程
       任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。
       任务队列(TaskQueue):用于存放没有处理的任务。提供一种缓冲机制。

 基本操作:
       一般情况下是首先初始化一定数量的工作线程,并把任务提交给空闲的线程,当线
    程都处于忙的状态的时候,则重新生成新的工作线程,当空闲线程较多的时候则停止一
    部分线程,这些要看你自己的调度算法。但是线程不能滥用,因为并不是线程越多就会
    带来更好的性能,这些都要看你的具体应用,具体可以参照侯捷先生的《windows多线
    程程序设计》
 

 何时使用:
    当系统需要频繁启动线程,且完成任务的时间较短时,使用线程池能有效的提高性能。

    PS:之所以要强调任务的执行时间较短,是因为:如果任务执行时间很长(eg:数据库访
       问),那么“节省线程对象创建时间”对提升整体性能的作用是很有限的。


 优化线程池设计:
    a)动态改变工作线程数量
      设置好线程池的上限和下限。为应对突发访问量增加的情况,防止大量任务积压在任
    务队列中,动态“批量增加工作线程”;访问量下降后可适当减少工作线程数。

      eg:SqlServer单进程多线程模式,1024个数量的线程池,动态线程分配,理论上限32767。
    
    b)优化成合适的工作线程数量
       调试时,根据“统计规律”选择“预期访问频率”下,效率最高的初始工作线程数量。

    c)多个线程池
       根据不同任务或者任务优先级来采用不同线程池处理,一般用于复杂系统中。

原文地址:https://www.cnblogs.com/edisonfeng/p/2565966.html