线程池

170 阅读2分钟
线程池,顾名思义,一个存放着线程的池子。

为什么会出现线程池?

  • 线程频繁的创建和销毁会对机器的性能有所影响,如果我们能够重复利用线程,避免频繁的创建和销毁可以减小计算机的性能损耗。
  • 线程池的核心参数?
    • 核心线程数
    • 最大线程数
    • 线程存活时间
    • 等待队列长度
    • 线程池拒绝策略
  • 任务调度机制?
    • 如果当前线程数小于核心线程数,那么就用核心线程执行
    • 如果当前线程数大于核心线程数,那么进入等待队列
    • 如果等待队列满了,那么创建线程的数量至最大线程
    • 如果线程池中已经有了最大线程数,并且等待队列也满了,那么执行拒绝策略。
  • 阻塞队列
    • ArrayBlocking 基于数组
    • LinkedBlocking 基于链表
    • Prior 优先队列
  • 拒绝策略
    • AbortPolicy 直接拒绝
    • DiscardPolicy 丢弃任务
    • DiscardOldestPolicy 丢弃最前面的任务
    • CallerRunsPolicy 调用线程继续执行该任务。
  • 线程池调优?
    • 区分业务背景
      • 快速响应
        • 线程池不应该设置等待队列,调高核心线程和最大线程数尽可能创造多的线程快速执行任务
      • 快速批量任务
        • 离线的大量计算任务,不需要快速响应,我们关系的就是 如何使用有限的资源尽可能在单位时间内更多的处理任务,我们应该设置等待队列,合适的调整核心线程,线程数过多也会引起线程上下文切换频繁的问题,也会降低任务的速度,降低吞吐量
  • 线程池参数设置
    • IO 密集
      • 特点cpu等待时间长 2n +1
    • CPU 密集
      • 特点CPU执行时间长 n+1
    • 公式: 最佳线程数量: 【 (线程等待时间+线程cpu时间)/ 线程等待时间 】 * CPU核数
    • 线程等待时间越高,需要越多线程,等待时间越少,则需要越少线程。
  • 线程池动态参数设置
    • 动态参数设置。