温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

ExecutorService如何关闭线程池

发布时间:2026-10-06 20:00:10 来源:亿速云 阅读:101 作者:小樊 栏目:编程语言

在 Java 中,ExecutorService 提供了几种关闭线程池的方式,核心区别在于是否等待已提交任务执行完成。下面系统性说明。


一、常用关闭方法

1️⃣ shutdown()(最常用,温和关闭)

executorService.shutdown();

行为:

  • 停止接收新任务
  • 已提交的任务(包括正在执行和队列中的)会继续执行完
  • 线程池在任务完成后才真正关闭

✅ 适合:正常业务结束


2️⃣ shutdownNow()(立即关闭)

List<Runnable> notExecuted = executorService.shutdownNow();

行为:

  • 停止接收新任务
  • 尝试中断正在执行的线程(通过 Thread.interrupt())
  • 返回未执行的任务列表
  • 不保证任务一定能立即停止(任务需响应中断)

✅ 适合:紧急退出、超时控制

⚠️ 注意:

  • 如果任务不处理 InterruptedException,可能不会停止

3️⃣ 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 ❌ ❌(尝试中断) ✅

四、Spring / 容器中的关闭

Spring 中

@Bean
public ExecutorService executorService() {
    return Executors.newFixedThreadPool(10);
}

@PreDestroy
public void destroy() {
    executorService.shutdown();
}

五、常见误区 ❌

❌ 只 shutdown() 但不 awaitTermination()
→ 主线程可能提前退出

❌ 认为 shutdownNow() 一定能杀掉任务
→ 只有响应中断的任务才会停止

❌ 忘记关闭线程池
→ 导致 JVM 无法退出


六、总结一句话

正常关闭用 shutdown() + awaitTermination(),强制关闭用 shutdownNow()。

如果你有 具体使用场景(定时任务 / Web 服务 / 批量处理),我可以给你更合适的关闭方案。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手