说起线程池,大家可能都比较熟悉,但是里面的源码又知多少呢? 不慌,五哥带你去翻翻源码

本篇文章会对线程池的源码进行跳跃式的代码和分析,不清楚的可以翻到源码位置并对照文章进行对比:

策略模式

在新创建一个线程池的时候,会在构造方法传入一个拒绝的策略,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); }
        }