参考文章:Java Executors类的9种创建线程池的方法及应用场景分析 - 威哥爱编程 - SegmentFault 思否
本文将介绍Executors中常见一些工厂方法。Executors中的工厂方法其实就是对ThreadPoolExecutor的封装,方便使用。
线程池的执行流程
- 创建线程池,并用线程工厂给线程起个好名字。
- 有任务过来,线程池才会创建线程,并执行任务。
- 后续还有任务过来,所有核心线程没有空闲的,那么就放入任务队列中等待,直到有空闲的线程。
- 任务队列如果是有界的,如果任务超过了队列的大小,此时就会创建临时线程来执行任务。
- 如果临时线程也到达了最大值,并且都没有空闲的。此时就会执行四种拒绝策略
- AbortPolicy 让调用者抛出 RejectedExecutionException 异常,这是默认策略
- CallerRunsPolicy 让调用者运行任务
- DiscardPolicy 放弃本次任务
- DiscardOldestPolicy 放弃队列中最早的任务,本任务取而代之
- 当任务都被完成后,临时线程到达指定的最大空闲时间后就会被释放。
可以看到ThreadPoolExecutor的最全构造方法
public ThreadPoolExecutor(int corePoolSize, // 核心线程数
int maximumPoolSize, // 最大线程数=核心线程数+临时线程数
long keepAliveTime, // 临时线程空闲最大时长
TimeUnit unit, // 空闲时长单位
BlockingQueue<Runnable> workQueue, // 阻塞队列
ThreadFactory threadFactory, // 线程工厂
RejectedExecutionHandler handler // 拒绝策略) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler =