我正在实现一个抛出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();
            }
        }
    }
    

    10-07 12:24