在 Java 中,ExecutorService 的“调优”本质上是在 吞吐量、延迟、资源占用、稳定性 之间做权衡。下面从 核心参数、队列、拒绝策略、监控、常见场景 几个维度系统讲一下。
new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
keepAliveTime,
TimeUnit.SECONDS,
workQueue,
threadFactory,
rejectedExecutionHandler
)
new ThreadPoolExecutor(..., new SynchronousQueue<>())
new LinkedBlockingQueue<>()
new ArrayBlockingQueue<>(1024)
✅ 调优建议:生产环境优先使用有界队列
| 策略 | 说明 | 场景 |
|---|---|---|
| AbortPolicy | 抛异常(默认) | 明确失败 |
| CallerRunsPolicy | 提交线程自己执行 | 削峰 |
| DiscardPolicy | 直接丢弃 | 可丢任务 |
| DiscardOldestPolicy | 丢最老任务 | 实时性要求高 |
✅ 高并发系统常用:
new ThreadPoolExecutor.CallerRunsPolicy()
new ThreadFactory() {
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setName("biz-pool-" + t.getId());
t.setDaemon(false);
return t;
}
}
作用:
corePoolSize = Ncpu
maximumPoolSize = Ncpu
queue = 有界队列
示例:
new ThreadPoolExecutor(
4, 4, 0L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<>(1000)
)
corePoolSize = Ncpu * 2
maximumPoolSize = Ncpu * 4~10
queue = 有界队列
executor.getActiveCount();
executor.getQueue().size();
executor.getCompletedTaskCount();
executor.getPoolSize();
executor.setCorePoolSize(10);
executor.setMaximumPoolSize(50);
❌ 使用 Executors.newFixedThreadPool()
❌ 线程池数量“拍脑袋”
❌ 所有任务用一个线程池
❌ 忽略异常
ThreadPoolExecutor executor = new ThreadPoolExecutor(
8,
32,
60L,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(2000),
new NamedThreadFactory("order-pool"),
new ThreadPoolExecutor.CallerRunsPolicy()
);
如果你愿意,可以告诉我:
我可以直接帮你 算一套具体参数。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。