在我抛出异常之前我应该​​使用Thread.currentThread.interrupt()吗?

时间:2014-03-24 20:47:46

标签: java exception-handling interrupted-exception

我正在实现抛出IOException的接口。在我的实现中,我调用另一个可以阻塞的方法,因此抛出InterruptedException

上下文:

  • 如果我被打断,我想结束治疗;
  • 这不是我自己创建的主题。

我目前的想法是这样做(骨架代码):

@Override
public void implementedMethod()
    throws IOException
{
    try {
        methodThatBlocks();
    } catch (InterruptedException ignored) {
        Thread.currentThread().interrupt();
        throw new IOException();
    }
}

是正确的方法吗?或者我应该throw而不是.interrupt()

2 个答案:

答案 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)

当然不是。该线程已被解除阻塞并正在运行。在即将抛出异常的代码中。有什么意义呢?