线程池参数需依任务类型配置:cpu密集型设核心线程数为cpu核数+1、最大线程数一致,用synchronousqueue;io密集型核心线程数≈cpu核数×2、最大线程数×5~10,队列容量20~200;混合场景优先分池隔离,禁用无界队列与静默拒绝策略。

核心线程数和最大线程数不能靠经验拍脑袋定,得看任务类型、CPU资源、实际负载三者配合。设小了压不住流量,设大了引发频繁上下文切换甚至内存溢出。
CPU 密集型任务:重计算、少等待
图像压缩、加解密、数值运算这类任务几乎不等 I/O,CPU 一直满负荷跑。此时线程数超过逻辑核数,只会增加调度开销。
- 核心线程数 = CPU 核心数 + 1(推荐用
Runtime.getRuntime().availableProcessors() + 1) - 最大线程数通常与核心线程数一致,避免动态扩容引入不确定性
- 队列建议用
SynchronousQueue或小容量有界队列(如ArrayBlockingQueue(50)),不希望任务排队,而要尽快执行
I/O 密集型任务:等得多、算得少
数据库查询、HTTP 调用、文件读写,线程大部分时间在阻塞态,CPU 空闲。可并行更多线程来“填满”空闲周期。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 核心线程数 ≈ CPU 核数 × 2(保障基础并发能力)
- 最大线程数按压测结果定,常见范围是 CPU 核数 × 5~10;若平均等待时间长、TPS 高,可再上浮
- 队列容量控制在 20~200 之间,宁可多开线程,也不让任务长期排队
- 务必检查下游瓶颈:DB 连接池上限、HTTP 客户端连接数、网关限流——线程再多,卡在连接池就全堵住
混合型或真实业务场景:别硬凑一个池
多数接口既做计算又查库,统一配池容易顾此失彼。CPU 型任务被 IO 阻塞线程饿死,IO 型又因线程不足堆积。
- 优先分池隔离:计算类走 CPU 优化池(
corePoolSize = n + 1),远程调用走 IO 优化池(corePoolSize = n × 2~3) - 必须共用时,保守按 IO 型配置,但要监控
getActiveCount()和getQueue().size()—— 持续高位说明 CPU 型任务已在排队 - 也可用公式粗估:核心线程数 ≈ CPU 核数 × 1.5,最大线程数 ≈ CPU 核数 × 3,队列容量 = 峰值 TPS × 平均耗时(秒)
配套底线必须守住
光调两个数没用,队列和拒绝策略决定线程池真实行为。
- 禁用无界队列:
LinkedBlockingQueue默认容量是Integer.MAX_VALUE,极易 OOM;务必显式指定容量 - 拒绝策略别用静默丢弃(
DiscardPolicy),生产环境推荐AbortPolicy(抛异常暴露问题)或CallerRunsPolicy(由提交线程自己执行,自然降速) - 上线后必须监控:活跃线程数、队列长度、拒绝任务数。持续排队或频繁拒绝,就是调参信号
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










