ThreadPoolExecutor:

1.png

ExecutorService:线程池最基本的接口,定义了一些基本方法

ScheduledExecutorService:新增任务调度功能,定时任务

ThreadPoolExecutor:最基本的实现

ScheduledThreadPoolExecutor:带有任务调度功能的实现

1.线程池状态:

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

2.png

2.构造方法:

corePoolSize:核心线程数目(最多保留的线程数)

maximumPoolSize:最大线程数目 (由核心线程数和救急线程数组成)

keepAliveTime:生存时间—针对救急线程

unit:时间单位—针对救急线程

workQueue:阻塞队列

threadFactory:线程工厂—可以给创建的线程起名字

handler:拒绝策略


线程池中刚开始没有线程,当一个任务提交给线程池后,线程池会创建一个新线程来执行任务。

当线程数达到 corePoolSize 并没有线程空闲,这时再加入任务,新加的任务会被加入workQueue 队列排

队,直到有空闲的线程。

如果队列选择了有界队列,那么任务超过了队列大小时,会创建 maximumPoolSize - corePoolSize 数目的线

程来救急。

如果线程到达 maximumPoolSize 仍然有新任务这时会执行拒绝策略。拒绝策略 jdk 提供了 4 种实现,其它

著名框架也提供了实现

  1. AbortPolicy 让调用者抛出 RejectedExecutionException 异常,这是默认策略
  2. CallerRunsPolicy 让调用者运行任务
  3. DiscardPolicy 放弃本次任务
  4. DiscardOldestPolicy 放弃队列中最早的任务,本任务取而代之
  5. Dubbo 的实现,在抛出 RejectedExecutionException 异常之前会记录日志,并 dump 线程栈信息,方便定位问题
  6. Netty 的实现,是创建一个新线程来执行任务
  7. ActiveMQ 的实现,带超时等待(60s)尝试放入队列,类似我们之前自定义的拒绝策略
  8. PinPoint 的实现,它使用了一个拒绝策略链,会逐一尝试策略链中每种拒绝策略

当高峰过去后,超过corePoolSize 的救急线程如果一段时间没有任务做,需要结束节省资源,这个时间由

keepAliveTime 和 unit 来控制。

JDK中拒绝策略接口:
3.png