使用 ExecutorService 的核心目的,是把“任务的提交”和“任务的执行”解耦,统一管理线程资源,提高程序的可维护性、可扩展性和稳定性。下面从多个角度说明“为什么要用它”。
new Thread(() -> {
// do something
}).start();
存在的问题:
ExecutorService executor = Executors.newFixedThreadPool(10);
ExecutorService executor = Executors.newFixedThreadPool(5);
executor.submit(() -> System.out.println("task"));
Future<Integer> future = executor.submit(() -> 1 + 1);
Integer result = future.get();
executor.shutdown();
executor.awaitTermination(10, TimeUnit.SECONDS);
new ThreadPoolExecutor(
2, 4, 60, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(100),
new ThreadPoolExecutor.CallerRunsPolicy()
);
| 场景 | 原因 |
|---|---|
| Web 服务器处理请求 | 控制并发 |
| 批量任务处理 | 提高吞吐 |
| 定时 / 异步任务 | 统一管理 |
| 后台计算 | 不阻塞主线程 |
| 防止 OOM | 限制线程数 |
| 方案 | 问题 |
|---|---|
| new Thread | 不可控 |
| Timer | 单线程、异常会终止 |
| ForkJoinPool | 适合特定计算模型 |
| 手动维护线程 | 复杂、易出错 |
ExecutorService 是 Java 并发编程中用来“安全、可控、高效地管理线程和任务”的标准工具。
如果你愿意,我可以:
ExecutorService vs CompletableFuture免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。