在 Java 中,ExecutorService 是线程池的核心抽象,性能调优本质上是在 吞吐量、延迟、资源占用、稳定性 之间做平衡。下面从 参数配置、队列选择、监控与实战经验 几个维度系统说明。
以 ThreadPoolExecutor 为例:
new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
keepAliveTime,
TimeUnit.SECONDS,
workQueue,
threadFactory,
rejectedExecutionHandler
);
corePoolSize = CPU 核数corePoolSize = CPU 核数 * (1 + IO等待时间 / CPU计算时间)2 × CPU 核数 起步int cpu = Runtime.getRuntime().availableProcessors();
⚠️ 注意:
只有队列满了,才会创建非核心线程
| 队列类型 | 特点 | 风险 |
|---|---|---|
LinkedBlockingQueue |
无界(默认) | 内存溢出 |
ArrayBlockingQueue |
有界 | 更安全 |
SynchronousQueue |
不缓冲 | 直接创建线程 |
PriorityBlockingQueue |
优先级 | 复杂度高 |
✅ 生产环境必须使用有界队列
new ArrayBlockingQueue<>(1000)
内置策略:
AbortPolicy(默认,抛异常)CallerRunsPolicy(调用者线程执行,推荐)DiscardPolicy(直接丢弃)DiscardOldestPolicy(丢最老的)✅ 生产推荐:
new ThreadPoolExecutor.CallerRunsPolicy()
防止雪崩,形成天然限流。
new ThreadFactory() {
private final AtomicInteger i = new AtomicInteger();
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setName("biz-pool-" + i.incrementAndGet());
t.setDaemon(false);
return t;
}
}
好处:
core = cpu * 2
max = cpu * 4
queue = 200~500
core = cpu
max = cpu * 2
queue = 1000
core = 2~4
max = 10
queue = 无界但可控
executor.getActiveCount();
executor.getQueue().size();
executor.getCompletedTaskCount();
executor.getPoolSize();
ThreadPoolExecutor 的 setterDynamicThreadPool(如 Hippo4j)❌ 使用 Executors.newFixedThreadPool()
❌ 线程数过大
❌ 任务里做同步 IO 又用小线程池
ExecutorService 调优 = 合理线程数 + 有界队列 + 正确拒绝策略 + 持续监控
如果你愿意,可以告诉我:
我可以直接帮你算一套 具体线程池参数。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。