我正在实现抛出IOException
的接口。在我的实现中,我调用另一个可以阻塞的方法,因此抛出InterruptedException
。
上下文:
我目前的想法是这样做(骨架代码):
@Override
public void implementedMethod()
throws IOException
{
try {
methodThatBlocks();
} catch (InterruptedException ignored) {
Thread.currentThread().interrupt();
throw new IOException();
}
}
是正确的方法吗?或者我应该throw
而不是.interrupt()
?
答案 0 :(得分:4)
是的,你应该调用interrupt()让调用代码知道线程已被中断。如果你不这样做,因为InterruptedException清除它,调用代码将无法知道中断并且不会停止运行,尽管它应该。
让我引用实践中的Java并发:
恢复中断。有时您不能抛出InterruptedException,例如当您的代码是Runnable的一部分时。在这些情况下,您必须捕获InterruptedException并通过调用当前线程上的中断来恢复中断状态,以便调用堆栈上方的代码可以看到发出了中断, 如清单5.10所示。
public class TaskRunnable implements Runnable {
BlockingQueue<Task> queue;
...
public void run() {
try {
processTask(queue.take());
} catch (InterruptedException e) {
// restore interrupted status
Thread.currentThread().interrupt();
}
}
}
答案 1 :(得分:1)
当然不是。该线程已被解除阻塞并正在运行。在即将抛出异常的代码中。有什么意义呢?