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