中断,关闭方法和ExecutorService

时间:2013-07-24 09:27:34

标签: java concurrency executor

直接来自这个java教程:

  

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

有人能说出这一点吗?任务和中断与关机方法之间的关系是什么? 是否意味着如果有任务等待它必须抛出InterruptedException的内容?

提前致谢。

2 个答案:

答案 0 :(得分:8)

想象一下,您使用ExecutorService

运行此任务
class Task implements Runnable() {
   public void run() {
       while(true) {
       }
   }
}

现在要使用shutdownNow()关闭ExecutorService。 ExecutorService将在运行任务的线程上调用interrupt(),但由于任务没有响应中断,因此它将继续运行,ExecutorService将永远不会关闭。

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

       while(!Thread.interrupted()) {
       }

并允许ExecutorService关闭

答案 1 :(得分:3)

它只是意味着您及时检查代码中的interrupt状态。可以使用Thread.currentThread().isInterrupted()检查此内容。

在Java中,与其他Unix调用不同,您只有中断与其他线程通信。因此,您无法发送信号等。如果您希望通知另一个线程停止正在执行的操作,因为它可能不需要,那么通信的合法方式之一就是通过中断该线程。

  

中断线程会发生什么?

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

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

What is InterruptedException for?

java.util.concurrent包中,如果线程被阻塞(在awaitgetLock或在blockign队列中等),则使用某个类,并中断该线程。取消阻止库被抛出InterruptedException以通知您线程被阻止。

参考文献: