ExecutorService-中断线程的操作shutdown和shutdownNow

本文详细解析了ExecutorService的shutdown、shutdownNow及awaitTermination方法在中断线程时的作用。通过教育场景的比喻,阐述了如何在高并发环境中优雅地结束线程池。强调了正确调用顺序的重要性,指出不正确使用可能导致Java进程无法正常退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近在使用ExecutorService的时候,对于与ExecutorService相关的概念有些迷糊,

加上本身ExecutorService内部的有些方法名在取名上也容易让使用者误解,导致

犯了一些错误。在解决的过程中,偶尔看到了日本人写的一篇文章简单明了,通俗易懂

所以想着翻译成中文希望能够帮助到与我有一样困惑的程序员朋友们。

原文地址如下:

闲话少说,文章如下

虽然使用ExecutorService可以让线程处理变的很简单,
可是有没有人觉得在结束线程运行时候只调用shutdown方法就可以了?
实际上,只调用shutdown方法的是不够的。

我们用学校的老师和学生的关系来说明这个问题。

shutdown只是起到通知的作用

我们来假设如下场景:
学校里在课上老师出了一些问题安排全班同学进行解答并对学生说“开问题解答完毕后请举手示意!”
如果有学生解答完毕后会举手对老师说“老师我做完了!”,如果大家都解题完毕后上课结束。

上面的场景对应于ExecutorService里的方法的话是下面的样子。
老师: ExecutorService
学生: ExecutorService里的线程
问题: 通过参数传递给ExecutorService.execute的任务(Runnable)
授课: main线程
学校: Java进程

“问题解答完毕后请举手示意!”是shutdown方法。“老师我做完了!”是各个任务(Runnable)的运行结束。
所有的任务(Runnable)都结束了的话main线程(授课)也结束了。

在这里,我们假设试卷中有难度较大的

### 使用 `ExecutorService` 确保所有线执行完毕 为了确保所有的线在 `ExecutorService` 中已经完成执行,可以采用多种方法来实现这一点。一种常用的方法是在提交所有任务之后调用 `shutdown()` 方法,并随后使用 `awaitTermination()` 来等待直到所有任务都已完成。 下面展示了一个具体的例子: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class TaskManager { public static void main(String[] args) throws InterruptedException { ExecutorService executor = Executors.newFixedThreadPool(4); // 提交多个任务给线程池处理 for (int i = 0; i < 10; ++i) { Runnable worker = new WorkerThread("" + i); executor.execute(worker); } // 关闭线程池并阻止新的任务进入 executor.shutdown(); // 等待所有已提交的任务完成执行 if (!executor.awaitTermination(800, TimeUnit.MILLISECONDS)) { System.out.println("Not all tasks have completed within the timeout period."); } else { System.out.println("All threads finished execution successfully."); } // 如果有未完成的任务,则可以选择强制终止它们 if (!executor.isTerminated()) { executor.shutdownNow(); } } } ``` 在这个实例里,在创建固定大小为4的线程池后,通过循环向其中添加了十个不同的工作单元(即实现了Runnable接口的对象)。一旦所有的工作都被安排好,就立即调用了 `shutdown()` 函数停止接收任何新的请求。接着利用 `awaitTermination(long timeout, TimeUnit unit)` 设置最大超时时间来检测是否有剩余正在运行中的任务;如果在此期间内全部任务均告一段落则返回 true ,否则会抛出 false 并打印提示信息[^3]。 值得注意的是,这里设置的时间参数应当合理设定以适应实际应用场景下的预期最长时间。此外,还可以考虑捕获可能发生的中断异常以便更好地控制序流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值