ExecutorService 是 Java 中用于管理和调度线程的核心接口,位于 java.util.concurrent 包下。它比直接使用 Thread 更优雅、可控,适合线程池、任务执行、并发控制等场景。
下面从 概念 → 常用方法 → 使用示例 → 关闭线程池 → 常见用法模式 给你一个完整说明。
不用它时你可能这样写:
new Thread(() -> {
// do something
}).start();
问题:
✅ ExecutorService 解决这些问题。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
ExecutorService executor = Executors.newFixedThreadPool(5);
常见线程池类型:
| 方法 | 说明 |
|---|---|
newFixedThreadPool(n) |
固定大小线程池 |
newCachedThreadPool() |
可缓存线程池(线程可复用) |
newSingleThreadExecutor() |
单线程池 |
newScheduledThreadPool(n) |
支持定时/周期任务 |
executor.execute(() -> {
System.out.println("任务执行中");
});
✅ 无返回值
✅ 不能抛受检异常
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
Callable<String> task = () -> {
Thread.sleep(1000);
return "执行结果";
};
Future<String> future = executor.submit(task);
String result = future.get(); // 阻塞等待结果
System.out.println(result);
✅ 可返回结果
✅ 可抛异常
executor.shutdown(); // 不再接受新任务
或设置超时:
executor.awutdown();
executor.awaitTermination(10, TimeUnit.SECONDS);
executor.shutdownNow();
⚠ 不推荐随意使用,可能中断正在执行的任务。
ExecutorService executor = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
int taskId = i;
executor.execute(() -> {
System.out.println("任务 " + taskId + " 执行");
});
}
executor.shutdown();
ExecutorService executor = Executors.newFixedThreadPool(3);
List<Future<Integer>> futures = new ArrayList<>();
for (int i = 0; i < 5; i++) {
futures.add(executor.submit(() -> {
Thread.sleep(500);
return 1;
}));
}
int sum = 0;
for (Future<Integer> f : futures) {
sum += f.get();
}
System.out.println(sum);
executor.shutdown();
executor.submit(() -> {
// 发邮件、写日志、异步处理
});
Future<Integer> f1 = executor.submit(() -> calc1());
Future<Integer> f2 = executor.submit(() -> calc2());
int r1 = f1.get();
int r2 = f2.get();
✅ 线程池大小怎么定?
CPU 核心数 + 1CPU 核心数 * 2 或更多✅ execute 和 submit 区别?
| 对比 | execute | submit |
|---|---|---|
| 返回值 | 无 | Future |
| 异常 | 直接抛出 | 封装在 Future |
| 任务类型 | Runnable | Runnable / Callable |
ExecutorService 是 Java 中管理线程池、执行异步任务、控制并发的核心工具。
如果你愿意,我可以:
你想看哪一个?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。