理解 Thread.interrupt() 的用法

ben*_*enz 2 java multithreading interrupt

我正在阅读Oracle 文档中的中断。我无法弄清楚以下部分。它指出

如果线程长时间不调用抛出 InterruptedException 的方法怎么办?然后它必须定期调用 Thread.interrupted,如果收到中断则返回 true。例如:

for (int i = 0; i < inputs.length; i++) {
    heavyCrunch(inputs[i]);
    if (Thread.interrupted()) {
        // We've been interrupted: no more crunching.
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)

我绞尽脑汁地想理解,如果一个线程长时间没有调用抛出 InterruptedException 的方法,这是什么意思?其次,Thread.interrupted()的用法是什么,它是一种线程可以向自身发送中断的方法?这个场景的实际用途是什么?谢谢。

Nar*_*hai 5

这是一种保持线程可被中断的技术。

Thread.interrupted() :检查当前线程(本身)是否被其他线程中断并清除中断状态标志。所以它会问自己,当我正在执行一项巨大的任务并且没有听别人说话时,我是否被某人打断退出我正在做的事情。

想象一下如果那件事不做的话会发生什么。

假设 的一次迭代heavyCrunch()需要 1 分钟的时间。所以 n 次迭代将花费 n 分钟。

现在假设启动程序后您决定退出程序并正常终止程序。因此,您中断了正在执行繁重任务的线程。但线程不知道您已中断它,因为它没有检查中断状态。所以程序要等N分钟还没有结束才会结束,你将不得不等待很长时间

因此,为了优雅地终止线程,它应该始终检查中断状态,以便在其他人请求中断时做出响应。

  • `Thread.interrupted()` 只是为了简写这个 `Thread.currentThread().isInterrupted()`。在内部,甚至 `Thread.interrupted()` 也使用 `currentThread().isInterrupted()`。 (3认同)