我正在实现一个抛出IOException
的接口(interface)。在我的实现中,我调用了另一个可以阻塞的方法,因此抛出InterruptedException
。
语境:
我当前的想法是这样做的(骨架代码):
@Override
public void implementedMethod()
throws IOException
{
try {
methodThatBlocks();
} catch (InterruptedException ignored) {
Thread.currentThread().interrupt();
throw new IOException();
}
}
那是正确的方法吗?还是我应该只
throw
而不是.interrupt()
? 最佳答案
是的,您应该调用interrupt()来让调用代码知道线程已被中断。如果不这样做,由于InterruptedException清除了该内容,因此调用代码将无法知道该中断,并且即使有中断也不会停止运行。
让我引用实践中的Java并发性:
public class TaskRunnable implements Runnable {
BlockingQueue<Task> queue;
...
public void run() {
try {
processTask(queue.take());
} catch (InterruptedException e) {
// restore interrupted status
Thread.currentThread().interrupt();
}
}
}