为什么要捕获InterruptedException来调用Thread.currentThread.interrupt()?

时间:2009-12-13 07:56:46

标签: java multithreading interrupted-exception

在Effective Java(第275页)中,有以下代码段:

...
for (int i = 0; i < concurrency; i++) {
  executor.execute(new Runnable() {
    public void run() {
    ready.countDown();
    try {
      start.await();
      action.run();
    } catch (InterruptedException e) {
      Thread.currentThread().interrupt();
    } finally {
      done.countDown();
    }
  }
}
...

捕获被中断的异常只是为了重新提升它有什么用?为什么不让它飞起来?

3 个答案:

答案 0 :(得分:15)

简单的答案是InterruptedException是一个经过检查的例外,它不在Runnable.run方法(或Executable.execute()方法)的签名中。所以你必须抓住它。一旦你抓住它,调用Thread.interrupt()设置中断标志是建议做的事情......除非你真的打算压缩中断。

答案 1 :(得分:0)

有时你不能忽视异常,你必须抓住它。主要是当你覆盖不能根据其签名抛出InterruptedException的方法时会发生这种情况。例如,此方法通常用于Runnable.run()方法。

答案 2 :(得分:0)

执行程序可以在取消任务时中断任务,但会清除任务之间的中断标志,以避免一个被取消的任务中断不相关的任务。

因此,如果它实际上做了什么,那么在这里中断当前线程将是危险的。

更简单的方法是使用Callable或忽略中断。

此外,捕获并记录try / catch块中抛出的任何错误或异常是个好主意,否则异常/错误将被丢弃,您的程序可能会失败,但您不会知道它是什么或为什么。< / p>