流程图说明:
主流程(任务提交):
-
提交任务:调用
execute(Runnable)
方法 -
核心线程检查:
→ 是:创建新工作线程直接执行该任务
→ 否:尝试将任务加入队列 -
队列检查:
→ 入队成功:任务进入等待队列
→ 队列已满:检查线程数上限 -
最大线程检查:
→ 未达上限:创建新线程执行任务
→ 已达上限:执行拒绝策略
工作线程循环:
-
获取任务:
-
核心线程:
workQueue.take()
(永久阻塞) -
非核心线程:
workQueue.poll(keepAliveTime)
(超时等待)
-
-
任务执行:调用任务的
run()
方法 -
循环处理:执行完成后继续获取新任务
-
线程终止:当
getTask()
返回 null 时(超时或线程池关闭)
关键特点可视化:
-
三级缓冲机制:
-
第一级:核心线程(快速响应)
-
第二级:工作队列(缓冲峰值)
-
第三级:最大线程(应急处理)
-
-
线程回收:
-
⏳ 非核心线程空闲超过
keepAliveTime
后自动回收 -
♻️ 核心线程默认常驻(除非开启
allowCoreThreadTimeOut
)
-
-
拒绝策略:
-
🚫
AbortPolicy
:抛出异常(默认) -
🔙
CallerRunsPolicy
:调用者线程执行 -
🗑️
DiscardPolicy
:静默丢弃 -
🔄
DiscardOldestPolicy
:丢弃队首任务后重试
-
关键点总结:
-
核心优先: 优先创建核心线程处理任务(即使有空闲线程也会在核心数不足时创建)。
-
队列缓冲: 核心线程满后,新任务进入队列等待。
-
应急扩容: 队列满后,才创建非核心线程(上限
maximumPoolSize
)处理新提交的任务。 -
饱和拒绝: 队列满且线程数已达最大时,触发拒绝策略。
-
线程复用: 工作线程通过循环从队列获取任务执行,实现线程复用。
-
空闲回收: 非核心线程(及设置了
allowCoreThreadTimeOut
的核心线程)在空闲超过keepAliveTime
后会被回收,减少资源占用。 -
核心常驻: 默认情况下,核心线程即使空闲也会一直存在(除非设置了
allowCoreThreadTimeOut(true)
)。