1. 为什么线程池源码是面试必问项
去年帮朋友公司面试中级Java开发时,我特意统计过线程池相关问题的出现频率——在32场技术面中,有27场都涉及线程池实现原理的考察。这背后反映的是企业对于并发编程基础能力的硬性要求。
线程池作为Java并发包中的核心组件,其设计精妙之处在于:
- 通过复用线程降低资源消耗
- 提供任务队列实现流量削峰
- 内置拒绝策略保证系统稳定性
- 完善的监控接口便于运维
这些特性使其成为高并发场景的标配工具,也自然成为检验开发者功底的试金石。今天我们就从工作线程管理、任务调度机制、状态控制体系三个维度,拆解ThreadPoolExecutor的核心实现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 工作线程的生命周期管理
2.1 Worker类的设计奥秘
线程池中的工作线程都被封装为Worker对象,其核心结构如下:
java复制private final class Worker
extends AbstractQueuedSynchronizer
implements Runnable {
final Thread thread; // 实际执行任务的线程
Runnable firstTask; // 初始任务(可能为null)
volatile long completedTasks; // 完成任务计数器
}
这个设计有几点精妙之处:
- 继承AQS实现非重入锁,用于控制线程中断
- 将线程对象作为成员变量,实现线程与任务的解耦
- 通过completedTasks统计任务数,方便监控
关键细节:Worker初始化时会用ThreadFactory创建线程,并把自己(实现了Runnable)作为线程的初始任务。这就是为什么worker的run()方法会被执行。
2.2 线程启动与回收流程
线程池通过addWorker()方法创建新工作线程:
java复制private boolean addWorker(Runnable firstTask, boolean core) {
// 检查线程池状态、工作线程数等条件
// ...
Worker w = new Worker(firstTask);
Thread t = w.th
