序言

ThreadPoolExecutor类是jdk1.5之后提供的线程池,在java.util.concurrent包下。

1、ThreadPoolExecutor的继承关系

ThreadPoolExecutor - 图1

spring中的ThreadPoolTaskExecutor是其子类。

2、ThreadPoolExecutor的核心参数

int corePoolSize : 核心线程数
int maximumPoolSize :最大线程数
long keepAliveTime :非核心线程的存活时间
TimeUnit unit :keepAliveTime的单位
BlockingQueue workQueue :存放待执行任务的队列
RejectedExecutionHandler handler :当线程池满之后的拒绝策略

3、ThreadPoolExecutor执行任务顺序

4、常用的四种线程池

4.1、CachedThreadPool

可缓存的线程池,该线程池中没有核心线程,非核心线程的数量为Integer.max_value,就是无限大,当有需要时创建线程来执行任务,没有需要时回收线程,适用于耗时少,任务量大的情况

4.2、ScheduledThreadPoolExecutor

周期性执行任务的线程池,按照某种特定的计划执行线程中的任务,有核心线程,但也有非核心线程,非核心线程的大小也为无限大。适用于执行周期性的任务。
其继承关系如下:
ThreadPoolExecutor - 图2

4.3、SingleThreadPool

只有一条线程来执行任务,适用于有顺序的任务的应用场景。

4.4、FixedThreadPool

定长的线程池,有核心线程,核心线程的即为最大的线程数量,没有非核心线程

5、四种拒绝策略

5.1、AbortPolicy

不执行新任务,直接抛出异常,提示线程池已满。

5.2、DisCardPolicy

不执行新任务,也不抛出异常

5.3、DisCardOldSetPolic

将消息队列中的第一个任务替换为当前新进来的任务执行

5.4、CallerRunsPolicy

直接调用execute来执行当前任务

6、源码解析