在 Java 中,**Executor(执行器)**本身只是一个接口,真正需要“关闭”的是它的实现类,最常用的是 ThreadPoolExecutor 以及通过 Executors 创建的线程池。
下面从 概念 → 方法 → 最佳实践 系统说明。
Executor executor = Executors.newFixedThreadPool(10);
// executor 没有 shutdown 方法
✅ 需要 转型为 ExecutorService
ExecutorService executor = Executors.newFixedThreadPool(10);
shutdown()(温和关闭 ✅ 推荐)executor.shutdown();
行为:
适用场景:
shutdownNow()(强制关闭 ⚠️)executor.shutdownNow();
行为:
适用场景:
awaitTermination(常用)executor.shutdown();
try {
if (!executor.awaitTermination(30, TimeUnit.SECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException e) {
executor.shutdownNow();
Thread.currentThread().interrupt();
}
✅ 标准优雅关闭模板
ExecutorService executor = Executors.newFixedThreadPool(4);
executor.submit(() -> System.out.println("task"));
executor.shutdown();
try {
if (!executor.awaitTermination(10, TimeUnit.SECONDS)) {
executor.shutdownNow();
executor.awaitTermination(5, TimeUnit.SECONDS);
}
} catch (InterruptedException e) {
executor.shutdownNow();
Thread.currentThread().interrupt();
}
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
scheduler.shutdown();
shutdown / shutdownNow如果你用的是:
@Bean
public Executor taskExecutor() {
return Executors.newFixedThreadPool(10);
}
✅ Spring 会在容器关闭时自动调用 shutdown()
如果是 ThreadPoolTaskExecutor:
threadPoolTaskExecutor.shutdown();
❌ 忘记关闭线程池 → 应用无法退出
❌ 直接 shutdownNow() 导致数据不一致
❌ 不调用 awaitTermination
| 方法 | 是否接受新任务 | 是否执行已有任务 | 是否中断 |
|---|---|---|---|
| shutdown | ❌ | ✅ | ❌ |
| shutdownNow | ❌ | ❌(尝试) | ✅ |
| awaitTermination | — | 等待结束 | — |
✅ 最佳实践:
shutdown()+awaitTermination()+ 必要时shutdownNow()
如果你有 具体线程池类型 / 使用场景(Web、定时任务、异步处理),我可以给你更针对性的关闭方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。