在 Java 中,ExecutorService 的**优雅停机(Graceful Shutdown)**核心目标是:
不再接收新任务,但已提交的任务(包括正在执行和队列中等待的)尽量执行完,然后再释放线程资源。
下面从标准做法 → 进阶控制 → 常见坑三个层面说明。
ExecutorService executor = Executors.newFixedThreadPool(10);
// 1. 停止接收新任务
executor.shutdown();
try {
// 2. 等待已有任务执行完毕(最多等 30 秒)
if (!executor.awaitTermination(30, TimeUnit.SECONDS)) {
// 3. 超时后强制关闭
executor.shutdownNow();
}
} catch (InterruptedException e) {
// 被中断时,也尝试强制关闭
executor.shutdownNow();
Thread.currentThread().interrupt();
}
shutdown()
awaitTermination()
shutdownNow()
public static void gracefulShutdown(ExecutorService executor, long timeout, TimeUnit unit) {
executor.shutdown();
try {
if (!executor.awaitTermination(timeout, unit)) {
executor.shutdownNow();
executor.awaitTermination(timeout, unit);
}
} catch (InterruptedException e) {
executor.shutdownNow();
Thread.currentThread().interrupt();
}
}
✅ 优点:
ThreadPoolTaskExecutor@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(20);
executor.setQueueCapacity(100);
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(30);
executor.initialize();
return executor;
}
✅ Spring 关闭时会自动:
while (!Thread.currentThread().isInterrupted()) {
// 业务逻辑
}
或:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
❌ 以下代码无法优雅停止:
while (true) {
// 不检查中断
}
| 问题 | 原因 |
|---|---|
shutdownNow() 不生效 |
任务不响应中断 |
| 线程池不退出 | 任务阻塞(IO / 死锁) |
| 应用无法退出 | 未调用 shutdown |
awaitTermination 一直等 |
任务长期运行 |
优雅停机 = shutdown + awaitTermination + 可中断任务
如果你用的是:
可以告诉我具体场景,我可以给你更精确的停机方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。