6

直接来自这个java教程:

为了支持立即关闭,任务应该正确处理中断

任何人都能够阐明这一点吗?任务和中断以及关闭方法之间的关系是什么?这是否意味着如果有一个任务在等待它必须抛出的东西InterruptedException

提前致谢。

4

2 回答 2

11

想象一下,您使用 ExecutorService 运行此任务

class Task implements Runnable() {
   public void run() {
       while(true) {
       }
   }
}

现在你想用 shutdownNow() 关闭 ExecutorService。ExecutorService 将在运行任务的线程上调用 interrupt(),但由于任务不响应中断,它将继续运行并且 ExecutorService 永远不会关闭。

以下更改将使此任务可中断

       while(!Thread.interrupted()) {
       }

并将允许 ExecutorService 关闭

于 2013-07-24T10:06:51.840 回答
3

它的简单含义是您及时不断地检查interrupt代码中的状态。这可以使用Thread.currentThread().isInterrupted().

在 Java 中,与其他 Unix 调用不同,您只有中断才能与其他线程通信。因此,您不能发送信号等。如果您希望通知另一个线程停止它正在做的任何事情,因为它可能不需要,那么一种合法的通信方式是通过中断该线程。

当你中断一个线程时会发生什么?

默认情况下,每个线程在内部都有一个布尔false值。当你中断一个线程时,这个布尔值被设置为真。因此,文档要求您及时检查布尔值的状态。如果true,那么约定是停止执行任何已完成的任务并退出循环或其他任何事情。

虽然interrupting线程只是一个通知。但是按照 Java 的约定,它被视为关闭请求。您可以将此interrupt状态视为您想要的任何状态(例如:请求发送邮件、进行数据库转储等),但不建议这样做,因为大多数内部 java 库都是构建的,将其视为关闭请求。

What is InterruptedException for?

在包中,如果线程被阻塞(在或阻塞队列等中)并且您中断该线程java.util.concurrent,则使用某个类。被解除阻塞的库会抛出 InterruptedException 来通知您线程被阻塞。awaitgetLock

参考:

于 2013-07-24T10:23:17.830 回答