为什么要捕获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(); } } } ... 

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

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

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

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

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

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

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