为什么在 catch InterruptException 块中调用 Thread.currentThread.interrupt()?

新手上路,请多包涵

为什么在 catch 块中调用方法 Thread.currentThread.interrupt()

原文由 Hesey 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 674
2 个回答

这样做是为了 _保持状态_。

当您捕获 InterruptedException 并吞下它时,您基本上可以防止任何更高级别的方法/线程组注意到中断。这可能会导致问题。

通过调用 Thread.currentThread().interrupt() ,您设置了线程的中断标志,因此更高级别的中断处理程序将注意到它并可以适当地处理它。

Java 并发实践第 7.1.3 章:响应中断 中对此进行了更详细的讨论。它的规则是:

只有实现线程中断策略的代码才能吞下中断请求。通用任务和库代码不应该吞下中断请求。

原文由 Péter Török 发布,翻译遵循 CC BY-SA 4.0 许可协议

我认为这个代码示例让事情变得更清楚了。完成这项工作的班级:

 public class InterruptedSleepingRunner implements Runnable {
    @Override
    public void run() {
        doAPseudoHeavyWeightJob();
    }

    private void doAPseudoHeavyWeightJob() {
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            // You are kidding me
            System.out.println(i + " " + i * 2);
            // Let me sleep <evil grin>
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("Thread interrupted\n Exiting...");
                break;
            } else {
                sleepBabySleep();
            }
        }
    }

    protected void sleepBabySleep() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

Main 类:

 public class InterruptedSleepingThreadMain {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new InterruptedSleepingRunner());
        thread.start();
        // Giving 10 seconds to finish the job.
        Thread.sleep(10000);
        // Let me interrupt
        thread.interrupt();
    }
}

尝试在不设置状态的情况下调用中断。

原文由 Ajay George 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题