11

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

捕获中断的异常只是为了重新引发它有什么用?为什么不让它飞呢?

4

3 回答 3

15

简单的答案是这InterruptedException是一个检查异常,它不在Runnable.run方法(或Executable.execute()方法)的签名中。所以你必须抓住它。一旦你抓住它,调用Thread.interrupt()设置中断标志是推荐的事情......除非你真的打算压制中断。

于 2009-12-13T08:16:05.403 回答
0

有时你不能忽略异常,你必须抓住它。这主要发生在您覆盖无法InterruptedException根据其签名抛出的方法时。例如,这种方法通常用于Runnable.run()方法中。

于 2009-12-13T08:20:22.497 回答
0

如果任务被取消,执行者可以中断任务,但它会清除任务之间的中断标志,以避免一个被取消的任务中断一个不相关的任务。

因此,如果它实际上做了任何事情,在这里中断当前线程将是危险的。

解决此问题的更简单方法是使用 Callable 或忽略中断。

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

于 2009-12-13T15:26:04.490 回答