ExecutorService是什么
ExecutorService 是 Java 并发包(java.util.concurrent) 中的一个接口,用来管理和控制线程的执行。它是 Java 中线程池的核心抽象,比直接使用 Thread 更安全、更高效、更易管理。
一句话理解
ExecutorService 是一个“线程池管理器”,负责提交任务、调度线程、管理生命周期。
它解决了什么问题?
不用 ExecutorService(传统方式)
new Thread(() -> {
// 执行任务
}).start();
问题:
- 每次创建新线程,开销大
- 线程数量不可控
- 无法复用线程
- 难以管理(关闭、监控)
使用 ExecutorService
ExecutorService executor = Executors.newFixedThreadPool(5);
executor.submit(() -> {
System.out.println("任务执行");
});
优点:
✅ 线程复用
✅ 控制并发数量
✅ 支持任务队列
✅ 支持返回值(Callable)
✅ 生命周期管理
ExecutorService 的核心功能
1️⃣ 提交任务
提交 Runnable(无返回值)
executor.execute(() -> System.out.println("run"));
或
executor.submit(() -> System.out.println("run"));
提交 Callable(有返回值)
Future future = executor.submit(() -> {
return 1 + 1;
});
Integer result = future.get(); // 阻塞获取结果
2️⃣ 管理线程池生命周期
executor.shutdown(); // 不再接受新任务,等待已有任务完成
executor.shutdownNow(); // 尝试立即关闭
3️⃣ 获取执行结果
Future> future = executor.submit(task);
future.get(); // 阻塞等待结果
future.cancel(true); // 取消任务
常见 ExecutorService 创建方式
ExecutorService fixed = Executors.newFixedThreadPool(5);
ExecutorService cached = Executors.newCachedThreadPool();
ExecutorService single = Executors.newSingleThreadExecutor();
ScheduledExecutorService scheduled =
Executors.newScheduledThreadPool(3);
| 类型 | 说明 |
|---|---|
| FixedThreadPool | 固定线程数 |
| CachedThreadPool | 线程可复用、自动扩容 |
| SingleThreadExecutor | 单线程串行执行 |
| ScheduledThreadPool | 支持定时 / 周期性任务 |
⚠️ 生产环境建议手动创建 ThreadPoolExecutor,而不是用 Executors 工厂方法
Executor vs ExecutorService
| 接口 | 能力 |
|---|---|
Executor |
只支持执行任务 |
ExecutorService |
支持任务管理、生命周期、返回值 |
简单示例(完整)
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.submit(() -> System.out.println("任务1"));
executor.submit(() -> System.out.println("任务2"));
executor.shutdown();
总结
✅ ExecutorService 是 Java 中线程池的标准接口
✅ 用于提交任务、管理线程、控制并发
✅ 是并发编程的核心组件
✅ 实际开发中几乎都会用到
如果你愿意,我可以:
- 对比
ExecutorService和ThreadPoolExecutor - 结合 Spring / 实际业务场景讲
- 讲常见坑(OOM、任务堆积、优雅关闭)