温馨提示×

温馨提示×

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

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

java Executor 执行器如何关闭

发布时间:2026-11-10 01:11:33 来源:亿速云 阅读:89 作者:小樊 栏目:编程语言

在 Java 中,**Executor(执行器)**本身只是一个接口,真正需要“关闭”的是它的实现类,最常用的是 ThreadPoolExecutor 以及通过 Executors 创建的线程池。

下面从 概念 → 方法 → 最佳实践 系统说明。


一、Executor 不能直接关闭

Executor executor = Executors.newFixedThreadPool(10);
// executor 没有 shutdown 方法

✅ 需要 转型为 ExecutorService

ExecutorService executor = Executors.newFixedThreadPool(10);

二、ExecutorService 的关闭方式

1️⃣ shutdown()(温和关闭 ✅ 推荐)

executor.shutdown();

行为:

  • 不再接受新任务
  • 已提交的任务(包括正在执行和队列中的)会继续执行完

适用场景:

  • 正常停机
  • 服务优雅下线

2️⃣ shutdownNow()(强制关闭 ⚠️)

executor.shutdownNow();

行为:

  • 尝试中断正在执行的任务
  • 返回未开始执行的任务列表
  • 不保证任务一定能停止(取决于任务是否响应中断)

适用场景:

  • 紧急停止
  • 超时强制退出

三、等待线程池真正结束(非常重要)

1️⃣ awaitTermination(常用)

executor.shutdown();
try {
    if (!executor.awaitTermination(30, TimeUnit.SECONDS)) {
        executor.shutdownNow();
    }
} catch (InterruptedException e) {
    executor.shutdownNow();
    Thread.currentThread().interrupt();
}

✅ 标准优雅关闭模板


2️⃣ 完整示例(推荐)

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 关闭

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
scheduler.shutdown();
  • 定时任务同样适用 shutdown / shutdownNow
  • 周期任务会被取消

五、Spring 中的线程池关闭

如果你用的是:

@Bean
public Executor taskExecutor() {
    return Executors.newFixedThreadPool(10);
}

✅ Spring 会在容器关闭时自动调用 shutdown()

如果是 ThreadPoolTaskExecutor:

threadPoolTaskExecutor.shutdown();

六、常见错误 ❌

❌ 忘记关闭线程池 → 应用无法退出
❌ 直接 shutdownNow() 导致数据不一致
❌ 不调用 awaitTermination


七、总结

方法 是否接受新任务 是否执行已有任务 是否中断
shutdown ❌ ✅ ❌
shutdownNow ❌ ❌(尝试) ✅
awaitTermination — 等待结束 —

✅ 最佳实践:

shutdown() + awaitTermination() + 必要时 shutdownNow()

如果你有 具体线程池类型 / 使用场景(Web、定时任务、异步处理),我可以给你更针对性的关闭方案。

向AI问一下细节

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

AI
助
手