一. Java 线程池
1.1 实现
- 线程数小于 coreSize,创建线程,直到 coreSize 的数量;
- BlockingQueue 一直堆积线程;堆积到 BlockingQueue 的最大容量,此时开始开启线程,直到 maxSize;
- 如果到了 maxSize 的线程数,BlockingQueue 依然是满的,则开始对新添加进入的任务实行拒绝(按照拒绝策略);
- 如果线程数量大于 coreSize,而且有的线程空闲时间超过了 keepTimeAlive,则释放该资源;
注:1, 2, 3 步骤在 ThreadPoolExecutor # execute(Runnable command) 方法中;
1.2 核心构造参数
- coreSize: 核心线程数量,平时维持的线程数量;
- maxSize: 最大线程数量,如果 BlockingQueue 任务队列里堆积的任务过多,超过了队列限定最大值,则线程增多,增多至 maxSize 的线程数量;
- BlockingQueue<Runnable>: 任务队列,向其中放任务;可通过设定队列最大长度,设置最大任务数量;
- keepTimeAlive: 如果当前线程数量大于 coreSize,且线程空闲超过 keepTimeAlive 值,则释放该线程,最多释放到 coreSize 的线程数量;
- RejectPolicy: 拒绝策略;当队列已满,再向其中塞任务时的拒绝策略;
- threadFactory: 线程工厂,使用各自的方法生产线程;比如可以使用 NamedThreadFactory,可以为线程池命名;
1.3 拒绝策略
- ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出 RejectedExecutionException 异常。
- ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
- ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程);
- ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务 ;
参考地址:《线程池ThreadPoolExecutor实现原理》