思想:

  • 享元模式,利用已有的资源对新的请求进行复用,从而提高吞吐量

ThreadPoolExecutor

image.png

线程池状态

ThreadPoolExecutor 使用 int 的高 3 位来表示线程池状态,低 29 位表示线程数量
image.png

构造方法

image.png

  • corePoolSize 核心线程数目 (最多保留的线程数)
  • maximumPoolSize 最大线程数目
  • keepAliveTime 生存时间 - 针对救急线程
  • unit 时间单位 - 针对救急线程
  • workQueue 阻塞队列
  • threadFactory 线程工厂 - 可以为线程创建时起个好名字
  • handler 拒绝策略

image.png

  • 救急线程用于处理超出阻塞队列之外的任务

使用线程池

image.png

拒绝策略

JDK内置四个拒绝策略:
image.png


ScheduledExecutorService

ScheduledExecutor又称任务调度线程池,延迟执行:
image.png

定时执行demo:
image.png


Fork/join线程池

  • Fork/Join 是 JDK 1.7 加入的新的线程池实现,它体现的是一种分治思想,适用于能够进行任务拆分的 cpu 密集型运算
  • 所谓的任务拆分,是将一个大任务拆分为算法上相同的小任务,直至不能拆分可以直接求解。跟递归相关的一些计算,如归并排序、斐波那契数列、都可以用分治思想进行求解
  • Fork/Join 在分治的基础上加入了多线程,可以把每个任务的分解和合并交给不同的线程来完成,进一步提升了运算效率
  • Fork/Join 默认会创建与 cpu 核心数大小相同的线程池

image.png

使用

  1. 继承RecursiveTask接口(有返回值的)
  2. 编写compute方法,任务拆分的逻辑
  3. forkjoinPool执行