在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();
}
}
}
...
捕获被中断的异常只是为了重新提升它有什么用?为什么不让它飞起来?
答案 0 :(得分:15)
简单的答案是InterruptedException
是一个经过检查的例外,它不在Runnable.run
方法(或Executable.execute()
方法)的签名中。所以你必须抓住它。一旦你抓住它,调用Thread.interrupt()
设置中断标志是建议做的事情......除非你真的打算压缩中断。
答案 1 :(得分:0)
有时你不能忽视异常,你必须抓住它。主要是当你覆盖不能根据其签名抛出InterruptedException
的方法时会发生这种情况。例如,此方法通常用于Runnable.run()
方法。
答案 2 :(得分:0)
执行程序可以在取消任务时中断任务,但会清除任务之间的中断标志,以避免一个被取消的任务中断不相关的任务。
因此,如果它实际上做了什么,那么在这里中断当前线程将是危险的。
更简单的方法是使用Callable或忽略中断。
此外,捕获并记录try / catch块中抛出的任何错误或异常是个好主意,否则异常/错误将被丢弃,您的程序可能会失败,但您不会知道它是什么或为什么。< / p>