1. 线程池失控:高并发系统的隐形杀手
在Java高并发系统中,线程池失控引发的线上事故远比业务代码缺陷更致命。我曾亲历过多次因线程池配置不当导致的系统崩溃:某次大促期间,一个核心支付接口的线程池队列被瞬间打满,导致整个支付链路雪崩;另一次则是因为未限制线程池数量,最终耗尽系统资源引发OOM。这些事故的共同点在于——线程池被当成了普通工具随意使用,而非系统级资源严格管控。
线程池本质上是对操作系统线程的抽象管理,其资源消耗体现在三个维度:
- 内存开销:每个Java线程默认占用1MB栈空间(可通过-Xss调整)
- 调度开销:线程切换导致的上下文切换(Context Switch)消耗CPU周期
- 竞争开销:过多线程争抢CPU缓存(Cache Thrashing)降低执行效率
关键认知:线程池不是简单的并发工具,而是决定系统稳定性的关键基础设施。必须像管理数据库连接池一样,建立全生命周期的管控机制。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 线程池设计的四大铁律
2.1 禁止随意创建线程池
典型反模式:
java复制// 在方法内部直接创建线程池(绝对禁止!)
public void processOrder() {
ExecutorService executor = Executors.newCachedThreadPool();
executor.submit(() -> {...});
}
问题本质:
- 线程数量无上限(newCachedThreadPool最大创建Integer.MAX_VALUE个线程)
- 缺乏统一命名导致排查困难
- 无法进行全局资源调控
正确做法:
java复制// 使用中央线程池工厂
public class ThreadPoolRegistry {
private static final ExecutorService ORDER_IO_EXECUTOR =
ThreadPoolFactory.newIoExecutor("order-io");
public static ExecutorService getOrderIoExecutor() {
return ORDER_IO_EXECUTOR;
}
}
2.2 区分IO密集型与CPU密集型任务
任务类型判定标准:
- CPU密集型:任务执行时间中CPU计算占比 > 70%(如加密解密、复杂计算)
- IO密集型:任务执行时间中等待外部响应占比 > 70%(如数据库查询、HTTP调用)
配置差异对比表:
| 参数 | CPU密集型 | IO密集型 |
|---|---|---|
| corePoo |
