Java线程池执行流程为四步动态决策:先判线程数<corePoolSize则建核心线程;否则入队,失败则判<maximumPoolSize建非核心线程;否则触发拒绝策略。

Java线程池的执行流程不是“先排队再创建”,而是一套有优先级、带状态判断的动态决策链。核心逻辑围绕 corePoolSize、workQueue、maximumPoolSize 三个参数联动展开,每一步都依赖当前线程数和队列状态实时判断。
任务提交后怎么分配?四步逐级判断
调用 execute() 提交任务时,线程池按固定顺序做四次关键判断:
- 当前工作线程数
< corePoolSize?是 → 立即创建核心线程执行该任务(哪怕已有空闲核心线程) - 否则,尝试把任务加入 workQueue:入队成功 → 等待任一空闲线程从队列取任务;入队失败(队列满或 SynchronousQueue 无等待线程)→ 进入下一步
- 当前线程总数
< maximumPoolSize?是 → 创建非核心线程直接执行该任务(不走队列) - 否则(队列满 + 线程已达 maximumPoolSize)→ 触发拒绝策略(如抛异常、调用者自执行等)
线程怎么复用?靠无限循环 + 阻塞取任务
每个工作线程(Worker)本质是一个运行中的 Runnable,其 run() 方法内部是死循环:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 循环体里调用
getTask()从队列取任务 - 若当前是核心线程(线程数 ≤ corePoolSize),用
take()无限阻塞,直到队列有任务 - 若当前是非核心线程(线程数 > corePoolSize),用
poll(keepAliveTime, unit)限时等待,超时返回null,线程自然退出 - 拿到任务就
task.run();拿不到则跳出循环,线程终止,资源释放
空闲线程什么时候被回收?只针对非核心线程
线程回收不是“统一清理”,而是按类型区别对待:
立即学习“Java免费学习笔记(深入)”;
-
核心线程默认永驻:只要线程池没 shutdown,即使长期空闲也不会被回收(除非显式设置
allowCoreThreadTimeOut(true)) -
非核心线程按空闲时间回收:空闲超过
keepAliveTime(配合TimeUnit)后自动销毁,使线程数回落到corePoolSize - 回收动作发生在
getTask()超时返回null后,Worker 线程自行结束,无需外部干预
线程池关闭时发生了什么?两种方式行为不同
关闭不是立刻停摆,而是分阶段让任务“自然收尾”:
-
shutdown():设状态为 SHUTDOWN,不再接受新任务,但继续处理已入队任务和正在执行的任务,全部完成后进入 TERMINATED -
shutdownNow():设状态为 STOP,尝试中断所有正在执行的线程,并清空队列(返回未执行任务列表),不保证已提交任务一定执行完 - 无论哪种方式,只要还有活跃线程或未完成任务,线程池就不会真正终止

















