外观
一句话答案
CPU 密集型:N+1;IO 密集型:2N 或 N/(1-阻塞比);实际需压测找拐点,不要用 Executors 工厂方法。
核心要点
理论公式:
- CPU 密集型:线程数 = CPU 核心数 + 1(+1 防止页缺失等偶发等待)
- IO 密集型:线程数 = CPU 核心数 × 2,或更精确:
线程数 = CPU 核心数 × (1 + 平均等待时间/平均计算时间)
实际建议:
| 任务类型 | 参考值 | 示例 |
|---|---|---|
| 纯计算 | N+1 | 加密/压缩 |
| 数据库操作 | 2N~3N | CRUD 接口 |
| HTTP 调用 | 大(看超时时间) | 外部 API 调用 |
生产实践:
- 不要使用
Executors工厂方法(队列无界/线程无上限) - 动态调优:配置中心管理参数,运行时
setCorePoolSize()热调整 - 压测确认:逐步加大线程数,观察 TPS/RT/CPU 的拐点
线程池监控指标:
- 活跃线程数 / 队列堆积量 / 拒绝次数 / 任务执行时间
追问与易错
追问方向:
- IO 密集型为什么设 2N?
- 动态调整线程池参数怎么做?
- 监控线程池需要关注哪些指标?
易错点:
- ❌ CPU 密集型设 N 就行——+1 防止偶发等待
- ❌ 不压测直接上线——理论值只是参考
💡 记忆锚点
CPU 密集型像厨师炒菜,灶台就那么多,人再多也只能排队等灶(N+1)。IO 密集型像服务员等上菜,等的时候可以去招呼别桌(2N 或更多)。公式只是起点,实际要压测找 TPS 拐点——过多的线程就像厨房挤太多人,反而互相撞来撞去更慢。