线程池容量核算

线程数按任务类型核算:CPU 密集型接近核数,IO 密集型可按等待比放大;必须配队列上限与拒绝策略,防止无界队列掩盖过载。

口径

口径
CPU 密集型:线程数 ≈ 核数 + 1
IO 密集型:线程数 ≈ 核数 × (1 + 平均等待/平均计算)

队列选择:有界队列 + 拒绝策略(快速失败或降级)

线程池配置示例(Java)

线程池配置示例(Java)
int cores = Runtime.getRuntime().availableProcessors();
// 等待/计算比约 9:1 的 IO 密集任务
int threads = cores * 10;
var pool = new ThreadPoolExecutor(threads, threads, 60, TimeUnit.SECONDS,
        new ArrayBlockingQueue<>(2000),         // 有界队列
        new ThreadPoolExecutor.AbortPolicy());  // 拒绝策略:快速失败
// 监控:活跃线程、队列深度、拒绝与超时计数
线程数与队列容量要和上游超时联动:排队时间超过上游超时,任务做完也无人等待。

易错点

  • 一律使用无界队列,过载时延迟无上限增长
  • 线程池参数与上游超时不匹配,无效计算堆积

数据来源与参考

  • 《Java 并发编程实践》(Goetz 等)
  • 《性能之巅(第 2 版)》(Gregg)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌