ExecutorService 的优化通常围绕 线程数、任务类型、队列选择、拒绝策略、生命周期管理 等方面展开。下面从实战角度系统讲解优化思路,并给出示例。
| 任务类型 | 特点 | 推荐模型 |
|---|---|---|
| CPU 密集型 | 计算多、阻塞少 | 线程数 ≈ CPU 核心数 |
| IO 密集型 | 网络、DB、磁盘 | 线程数可以更大 |
| 混合型 | 既有计算又有 IO | 拆分线程池 |
经验公式
N + 1N * 2 或 N / (1 - 阻塞系数)int cpuNums = Runtime.getRuntime().availableProcessors();
Executors.newCachedThreadPool(); // 无线程数上限,容易 OOM
Executors.newFixedThreadPool(n); // 队列无界,风险高
ThreadPoolExecutorThreadPoolExecutor executor = new ThreadPoolExecutor(
4, // corePoolSize
8, // maximumPoolSize
60L, TimeUnit.SECONDS, // 空闲线程存活时间
new ArrayBlockingQueue<>(100), // 有界队列
new ThreadFactoryBuilder()
.setNameFormat("biz-pool-%d")
.build(),
new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);
| 队列 | 适用场景 | 风险 |
|---|---|---|
ArrayBlockingQueue |
有界、稳定 | ✅ 推荐 |
LinkedBlockingQueue |
默认无界 | ❌ 易 OOM |
SynchronousQueue |
直接交付 | 适合短任务 |
PriorityBlockingQueue |
有优先级 | 逻辑复杂 |
✅ 一定要用有界队列
常见策略对比:
| 策略 | 行为 | 建议 |
|---|---|---|
| AbortPolicy | 抛异常 | 默认,不推荐 |
| CallerRunsPolicy | 调用线程执行 | ✅ 推荐 |
| DiscardPolicy | 直接丢弃 | ❌ |
| DiscardOldestPolicy | 丢弃最老 | ❌ |
✅ 自定义拒绝策略(推荐)
new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
// 记录日志 / 降级 / 放入补偿队列
log.warn("task rejected");
}
}
❌ 一个线程池干所有事
✅ 不同业务、不同任务类型拆分线程池
ExecutorService ioExecutor;
ExecutorService cpuExecutor;
ExecutorService asyncLogExecutor;
✅ 优点:
executor.shutdown();
if (!executor.awaitTermination(30, TimeUnit.SECONDS)) {
executor.shutdownNow();
}
✅ 禁止:
executor.getActiveCount();
executor.getQueue().size();
executor.getCompletedTaskCount();
✅ 结合:
CompletableFuture.supplyAsync(() -> doWork(), executor)
.thenAccept(result -> handle(result));
✅ 优点:
❌ 使用 Executors 默认方法
❌ 队列无界
❌ 线程数过大
❌ 一个线程池通吃所有任务
❌ 不监控、不关闭
ThreadPoolExecutor pool = new ThreadPoolExecutor(
cpuNums * 2,
cpuNums * 4,
30,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(200),
new ThreadFactoryBuilder().setNameFormat("io-pool-%d").build(),
new ThreadPoolExecutor.CallerRunsPolicy()
);
如果你愿意,可以告诉我:
我可以帮你 直接给出最优线程池参数配置。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。