温馨提示×

温馨提示×

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

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

ExecutorService如何关闭服务

发布时间:2026-09-16 01:57:55 来源:亿速云 阅读:99 作者:小樊 栏目:编程语言

在 Java 中,ExecutorService 不能直接“停止”,需要通过优雅关闭或强制关闭的方式来释放线程资源。常见做法如下:


一、优雅关闭(推荐)

让已提交的任务执行完,不再接收新任务。

executorService.shutdown();

特点:

  • 不再接受新任务
  • 已提交的任务会继续执行
  • 不会中断正在执行的任务

配合等待超时

executorService.shutdown();
try {
    if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
        // 超时后仍未结束
        executorService.shutdownNow();
    }
} catch (InterruptedException e) {
    executorService.shutdownNow();
    Thread.currentThread().interrupt();
}

二、立即关闭(强制)

尝试中断所有任务。

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

特点:

  • 尝试中断正在执行的线程(Thread.interrupt())
  • 返回未开始执行的任务列表
  • 不能保证任务一定能停止(依赖任务是否响应中断)

三、完整关闭示例(最佳实践)

ExecutorService executor = Executors.newFixedThreadPool(4);

// 提交任务
executor.execute(() -> { /* 任务 */ });

// 关闭
executor.shutdown();
try {
    if (!executor.awaitTermination(30, TimeUnit.SECONDS)) {
        executor.shutdownNow();
        if (!executor.awaitTermination(10, TimeUnit.SECONDS)) {
            System.err.println("线程池未完全关闭");
        }
    }
} catch (InterruptedException e) {
    executor.shutdownNow();
    Thread.currentThread().interrupt();
}

四、注意事项

  1. 不调用 shutdown 会导致 JVM 不退出
  2. 任务中要正确处理 InterruptedException
  3. 使用 try-finally 或 Spring 的 @PreDestroy 保证关闭
  4. 线程池长时间不用一定要及时关闭

如果你使用的是:

  • ThreadPoolExecutor
  • Spring ThreadPoolTaskExecutor
  • ScheduledExecutorService

我可以给你对应的关闭方式。

向AI问一下细节

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

AI
助
手