线程池线程数如何合理设置
请说明线程池核心线程数(corePoolSize)和最大线程数(maximumPoolSize)的原则公式和影响因素。
回答
孤独的心
核心公式:
CPU密集型任务:
- 线程数 = CPU核数 + 1(+1防止缺页中断导致线程阻塞后CPU空闲)。
- 示例:4核CPU → 5个线程。
IO密集型任务:
- 线程数 = CPU核数 × (1 + 等待时间/计算时间)
- 经验值:CPU核数 × 2~3倍。
- 原理:IO等待时CPU可切换执行其他线程。
混合型任务:
- 分离CPU密集和I/O密集到不同线程池。
其他影响因素:
- 内存限制:每个线程有独立栈空间(默认-Xss约1MB)。
- 系统资源:数据库连接数、文件句柄数限制。
- 任务类型:短任务需要更多线程分担调度开销。
- 响应时间要求:需要更短响应时间,可适当增加线程数。
推荐方式:
- 通过压测工具(JMeter/arthas)监控线程池队列积压和CPU利用率,实际调整。
- 使用动态线程池(如Hippo4J)运行时调整参数。