【问题标题】:Interrupts, shutdown method and ExecutorService中断、关闭方法和ExecutorService
【发布时间】:2013-07-24 09:27:33
【问题描述】:

直接来自这个java 教程:

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

有人能说清楚吗?任务和中断以及关闭方法之间的关系是什么?它是否意味着如果有任务等待它必须抛出InterruptedException

提前致谢。

【问题讨论】:

标签: java concurrency executor


【解决方案1】:

假设您使用 ExecutorService 运行此任务

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

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

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

       while(!Thread.interrupted()) {
       }

并将允许 ExecutorService 关闭

【讨论】:

    【解决方案2】:

    这只是意味着您及时地检查代码中的interrupt 状态。这可以使用Thread.currentThread().isInterrupted() 进行检查。

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

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

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

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

    What is InterruptedException for?
    

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

    参考资料:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-06
      • 2019-11-09
      • 2012-05-17
      相关资源
      最近更新 更多