zoukankan      html  css  js  c++  java
  • 线程池基本理论

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

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

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

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

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


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

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

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

  • 相关阅读:
    POJ 3630 Phone List/POJ 1056 【字典树】
    HDU 1074 Doing Homework【状态压缩DP】
    POJ 1077 Eight【八数码问题】
    状态压缩 POJ 1185 炮兵阵地【状态压缩DP】
    POJ 1806 Manhattan 2025
    POJ 3667 Hotel【经典的线段树】
    状态压缩 POJ 3254 Corn Fields【dp 状态压缩】
    ZOJ 3468 Dice War【PD求概率】
    POJ 2479 Maximum sum【求两个不重叠的连续子串的最大和】
    POJ 3735 Training little cats【矩阵的快速求幂】
  • 原文地址:https://www.cnblogs.com/edisonfeng/p/2565966.html
Copyright © 2011-2022 走看看