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


在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();
    }
  }
}
...

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


2095
2017-12-13 07:56


起源



答案:


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


15
2017-12-13 08:16



假设您希望线程实际上被中断。您也可以捕获并吞下异常,这将抑制线程中断。 - Francis Upton
你的意思是它不在Runnable的签名中。我会使用Callable代替。另外 - 调用Thread.currentThread()。interrupt()不会抛出该异常?扔掉它有什么意义呢? - ripper234
我相信你的意思是 InterruptedException 是一个经过检查的例外,不在签名中 Runnable.run() (不 Executor.execute)。 - Tom
@Francis,@ Tom,@ atper is ...纠正 - Stephen C


答案:


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


15
2017-12-13 08:16



假设您希望线程实际上被中断。您也可以捕获并吞下异常,这将抑制线程中断。 - Francis Upton
你的意思是它不在Runnable的签名中。我会使用Callable代替。另外 - 调用Thread.currentThread()。interrupt()不会抛出该异常?扔掉它有什么意义呢? - ripper234
我相信你的意思是 InterruptedException 是一个经过检查的例外,不在签名中 Runnable.run() (不 Executor.execute)。 - Tom
@Francis,@ Tom,@ atper is ...纠正 - Stephen C


有时你不能忽略异常,你必须抓住它。当你重写不能抛出的方法时,主要发生这种情况 InterruptedException 按照其签名。例如,这种方法通常用于 Runnable.run() 方法。


0
2017-12-13 08:20





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

因此,如果实际执行任何操作,在此处中断当前线程将是危险的。

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

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


0
2017-12-13 15:26