ThreadPoolExecutor原理分析
先看一下ThreadPoolExecutor构造器方法(参数最多的那个)
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
//参数的初始化
.......
}
参数解析:
- corePoolSize :线程池中的核心线程数
- maximumPoolSize:线程池允许的最大线程数,BlockingQueue满了,当线程池中的线程数< maximumPoolSize时,当有新的任务到来时,会继续创建新的线程去处理
- keepAliveTime:线程空闲下来后,存活的时间,这个参数只在线程池中线程数量>corePoolSize才有效
- unit : 存活时间单位值(秒,毫秒等)
- workQueue : 保存任务的阻塞队列
- threadFactory:创建线程的工厂,给新建的线程赋予名字
- handler : 任务饱和拒绝策略
AbortPolicy: 默认直接抛出异常;
CallerRunsPolicy: 用调用者所在的线程来执行任务;
DiscardOldestPolicy: 丢弃阻塞队列里面最老的任务,队列里面最靠前的任务;
DicardPolicy: 当前任务直接丢弃
当然我们也可以实现RejectedExecutionHandler接口来实现自己的饱和拒绝策略
图解:
- 当线程池中的线程(已开启的线程)个数 < corePoolSize时,每次进来新的任务,就启动一个线程去处理这个任务;
- 当线程池中的线程个数 > corePoolSize时,这时每次进来的任务会加入到BlockingQueue队列中;
- 当线程池中的线程个数 >= corePoolSize且< maximumPoolSize, 并且BlockingQueue队列也满了,这个时候再来新的任务时,就会继续创建新的线程去处理。这个时候创建的线程,当这些线程空闲下来的时候到keepAliveTime结束就会销毁;
- 当线程池中的线程数 >= maximumPoolSize时,这个时候再来新的任务,就会执行拒绝策略。