在哪种情况下你保留中断状态?

时间:2016-04-05 11:54:36

标签: java multithreading threadpool

我感兴趣的是你捕获InterruptedExceptions但保留中断状态的情况..比如下面的例子

try{
    //Some code
    } catch (InterruptedException ie) {
         // (Re-)Cancel if current thread also interrupted
         pool.shutdownNow();
         // Preserve interrupt status
         Thread.currentThread().interrupt();
    }

1 个答案:

答案 0 :(得分:0)

如果您需要调用者知道发生了中断,您将重新中断该线程,但是您无法更改方法签名以声明方法throws InterruptedException

例如,如果您正在实施java.lang.Runnable,则无法更改方法签名以添加已检查的异常:

interface Runnable {
  void run();
}

因此,如果您在InterruptedException实现中执行了Runnable并且无法处理它,则应在该线程上设置中断标志,以允许调用类来处理它:

class SleepingRunnable implements Runnable {
  @Override public void run() {
    try {
      Thread.sleep(5000);
    } catch (InterruptedException e) {
      Thread.currentThread().interrupt();
    }
  }
}

如果您能够更改方法签名,最好这样做:因为InterruptedException是一个已检查的异常,呼叫者被迫处理它。这使得你的线程可能会被打断得更加明显。