在 Java 中,ExecutorService 提供了几种关闭线程池的方式,核心区别在于是否等待已提交任务执行完成。下面系统性说明。
shutdown()(最常用,温和关闭)executorService.shutdown();
行为:
✅ 适合:正常业务结束
shutdownNow()(立即关闭)List<Runnable> notExecuted = executorService.shutdownNow();
行为:
Thread.interrupt())✅ 适合:紧急退出、超时控制
⚠️ 注意:
InterruptedException,可能不会停止awaitTermination()(等待关闭完成)executorService.shutdown();
boolean terminated = executorService.awaitTermination(10, TimeUnit.SECONDS);
行为:
false✅ 常用于:优雅停机
executorService.shutdown();
try {
if (!executorService.awaitTermination(30, TimeUnit.SECONDS)) {
executorService.shutdownNow();
executorService.awaitTermination(10, TimeUnit.SECONDS);
}
} catch (InterruptedException e) {
executorService.shutdownNow();
Thread.currentThread().interrupt();
}
shutdown() vs shutdownNow() 对比| 方法 | 是否接收新任务 | 是否执行已提交任务 | 是否中断线程 |
|---|---|---|---|
| shutdown | ❌ | ✅ | ❌ |
| shutdownNow | ❌ | ❌(尝试中断) | ✅ |
@Bean
public ExecutorService executorService() {
return Executors.newFixedThreadPool(10);
}
@PreDestroy
public void destroy() {
executorService.shutdown();
}
❌ 只 shutdown() 但不 awaitTermination()
→ 主线程可能提前退出
❌ 认为 shutdownNow() 一定能杀掉任务
→ 只有响应中断的任务才会停止
❌ 忘记关闭线程池
→ 导致 JVM 无法退出
正常关闭用
shutdown()+awaitTermination(),强制关闭用shutdownNow()。
如果你有 具体使用场景(定时任务 / Web 服务 / 批量处理),我可以给你更合适的关闭方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。