在 Java 中,ExecutorService 本身只是线程池框架,能否“提高性能”取决于如何使用它。下面从原理到实践说明如何通过 ExecutorService 提升性能。
int poolSize = Runtime.getRuntime().availableProcessors();
或
int poolSize = Ncpu + 1;
int poolSize = Ncpu * 2; // 甚至更多
经验公式:
线程数 ≈ CPU核心数 * (1 + 等待时间 / 计算时间)
| 场景 | 推荐 |
|---|---|
| 固定并发 | Executors.newFixedThreadPool |
| 大量短任务 | Executors.newCachedThreadPool |
| 定时任务 | ScheduledThreadPoolExecutor |
| 高吞吐 | ThreadPoolExecutor(自定义) |
✅ 生产环境建议自定义 ThreadPoolExecutor
new ThreadPoolExecutor(
corePoolSize,
maxPoolSize,
keepAliveTime,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(queueSize),
new ThreadFactoryBuilder().setNamePrefix("biz-").build(),
new ThreadPoolExecutor.CallerRunsPolicy()
);
关键点:
❌ 错误示例:
executor.submit(() -> {
httpClient.get(); // 阻塞
});
✅ 优化:
List<Future<Result>> futures = tasks.stream()
.map(t -> executor.submit(() -> process(t)))
.collect(toList());
for (Future<Result> f : futures) {
f.get();
}
适合:
CompletableFuture.supplyAsync(this::task1, executor)
.thenCombine(
CompletableFuture.supplyAsync(this::task2, executor),
(r1, r2) -> combine(r1, r2)
);
优点:
❌ 太细:线程切换成本高
❌ 太粗:并发度低
✅ 原则:
ExecutorService 提高性能的核心:
用合适的线程数 + 合理任务拆分 + 避免阻塞 + 可控资源
如果你有具体场景(Web、批处理、IO、CPU 计算),我可以给你更精确的线程池配置方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。