温馨提示×

温馨提示×

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

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

java Executor执行器如何关闭

发布时间:2026-10-20 19:07:16 来源:亿速云 阅读:96 作者:小樊 栏目:编程语言

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

下面按常见场景说明如何关闭。


一、ExecutorService 的关闭方式

ExecutorService 是 Executor 的子接口,提供了关闭方法。

1️⃣ shutdown()

executorService.shutdown();

特点:

  • 不再接受新任务
  • 已提交的任务(正在执行 + 队列中)会继续执行完
  • 不会阻塞调用线程

适用场景:

  • 平滑关闭(推荐)

2️⃣ shutdownNow()

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

特点:

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

适用场景:

  • 需要尽快关闭
  • 可以丢弃未执行任务

二、等待线程池真正关闭

awaitTermination(通常配合 shutdown 使用)

executorService.shutdown();
try {
    if (!executorService.awaitTermination(10, TimeUnit.SECONDS)) {
        executorService.shutdownNow();
    }
} catch (InterruptedException e) {
    executorService.shutdownNow();
}

流程说明:

  1. 先 shutdown()
  2. 等待一段时间
  3. 超时仍未结束 → 强制 shutdownNow()

三、Executors 创建的线程池如何关闭

ExecutorService pool = Executors.newFixedThreadPool(10);

// 使用完后
pool.shutdown();

⚠️ 注意:

  • Executors.newCachedThreadPool() 也可能一直存活
  • 不关闭线程池会导致 JVM 无法退出

四、Spring 中的 Executor 关闭

如果你用的是 Spring 的 ThreadPoolTaskExecutor:

@Bean
public Executor taskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(5);
    executor.setMaxPoolSize(10);
    executor.setQueueCapacity(100);
    executor.setWaitForTasksToCompleteOnShutdown(true);
    executor.setAwaitTerminationSeconds(30);
    executor.initialize();
    return executor;
}

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


五、常见错误 ❌

❌ 只提交任务不关闭线程池
❌ 用 shutdownNow() 后认为任务一定停止
❌ 在 finally 外关闭线程池

✅ 推荐写法:

ExecutorService executor = Executors.newSingleThreadExecutor();
try {
    executor.submit(() -> {});
} finally {
    executor.shutdown();
}

六、总结

方法 是否接受新任务 是否执行已有任务 是否阻塞
shutdown ❌ ✅ ❌
shutdownNow �️ ❌(尝试中断) ❌
awaitTermination - - ✅

如果你有 具体线程池类型(如 ForkJoinPool / ScheduledExecutorService) 或使用场景,我可以给更针对性的示例。

向AI问一下细节

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

AI
助
手