说起线程池,大家可能都比较熟悉,但是里面的源码又知多少呢? 不慌,五哥带你去翻翻源码
本篇文章会对线程池的源码进行跳跃式的代码和分析,不清楚的可以翻到源码位置并对照文章进行对比:
在新创建一个线程池的时候,会在构造方法传入一个拒绝的策略,jdk内部封装了几个常用的拒绝策略,并抽象了拒绝策略的接口,供开发者去实现。
以下源码位置均在jdk的TheadPoolExecutor类
拒绝类 | 拒绝实现 | 位置 |
---|---|---|
AbortPolicy | 抛出异常 | 2047行 |
DiscardPolicy | 不去处理 | 2071行 |
DiscardOldestPolicy | 执行任务 | 2107行 |
CallerRunsPolicy | 同步执行(main线程) | 2023行 |
当然用户还可以手动去实现RejectedExecutionHandler
开发自己的拒绝策略
在使用到Executors类的时候,用到了newSingleThreadExecutor
方法
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
return new FinalizableDelegatedExecutorService (new
ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS, new
LinkedBlockingQueue<Runnable>(), threadFactory));
}
在这里,jdk在创建单个线程池的时候用到了装饰器模式,原因是因为如果用ThreadPoolExecutor
类,则用户可以手动修改核心线程的个数,这样就违背了单线程池的初衷,因此将ThreadPoolExecutor
类装饰起来,取消掉setCoreSize等方法,仅暴露出AbstractExecutorService
提供的抽象方法实现
static class DelegatedExecutorService extends AbstractExecutorService {
private final ExecutorService e;
//间接调用该实现 为了屏蔽setXXX方法
DelegatedExecutorService(ExecutorService executor) { e = executor; }
//...
public void execute(Runnable command) { e.execute(command); }
}