1. 线程池核心参数解析
线程池的七个核心参数构成了其运行机制的基础框架,理解这些参数对合理配置线程池至关重要。让我们通过一个生产环境的案例来说明:假设我们需要处理一个日均百万级的订单处理系统,线程池配置不当会导致系统崩溃。
java复制ThreadPoolExecutor executor = new ThreadPoolExecutor(
5, // 核心线程数
20, // 最大线程数
60, // 空闲线程存活时间
TimeUnit.SECONDS, // 时间单位
new ArrayBlockingQueue<>(100), // 工作队列
new CustomThreadFactory(), // 线程工厂
new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);
1.1 核心线程数 vs 最大线程数
核心线程数(corePoolSize)是线程池长期维持的线程数量。在电商订单系统中,我们通过压测发现5个核心线程能稳定处理80%的日常流量。最大线程数(maximumPoolSize)则是应急机制,当队列满且核心线程都在忙时,线程池会创建新线程直到达到此上限。
关键经验:核心线程数设置应参考CPU核心数,通常建议N+1(N为CPU核心数)。最大线程数应根据系统可承受的突发流量设置。
1.2 阻塞队列选型
常见的阻塞队列有四种实现,每种对应不同的场景:
| 队列类型 | 特性 | 适用场景 |
|---|---|---|
| ArrayBlockingQueue | 有界队列,固定大小 | 需要控制队列长度的场景 |
| LinkedBlockingQueue | 可选有界,默认Integer.MAX_VALUE | 任务相互独立,无依赖的场景 |
| SynchronousQueue | 不存储元素,直接传递 | 高吞吐量,短暂任务场景 |
| PriorityBlockingQueue | 带优先级的无界队列 | 任务需要区分优先级的场景 |
在金融交易系统中,我们使用ArrayBlockingQueue防止内存溢出,而在日志处理系统中则采用LinkedBlockingQueue提高吞吐量。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 线程池生命周期与状态转换
线程池有五种状态,构成严谨的状态机:
2.1 状态流转示意图
plaintext复制RUNNING -> SHUTDOWN -> TIDYING -> TERMINATED
\ -> STOP -> TIDYING -> TERMINATED
- RUNNING:接受新任务并处理队列任务
- SHUTDOWN:不接受新任务,但处理队列任务
- STOP:不接受新任务,不处理队列任务,中断正在执行任务
- TIDYING:所有任务已终止,workerCount=0
- TERMINATED:terminated()方法执行完成
2.2 状态转换触发条件
java复制// 优雅关闭
public void shutdown() {
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
advanceRunState(SHUTDOWN);
interruptIdleWorkers();
} finally {
mainLock.unlock();
}
tryTerminate();
}
// 立即关闭
public List<Runnable> shutdownNow() {
List<Runnable> tasks;
final R
