哪个代码可以吞噬interruptedException?

gst*_*low 5 java concurrency interrupted-exception

我在实践中读过一致性。现在我想了解如何处理InterrruptedException

书中的建议:

-传播异常(可能在特定于任务的某些清除之后),这也使您的方法成为可中断的阻塞方法;或
-恢复中断状态,以便调用堆栈中更高级别的代码可以处理它。
-只有实现线程中断策略的代码才能吞下中断请求。通用任务和库代码绝不应吞咽中断请求。

前两个陈述对我来说很清楚,但我不明白第三个。你能澄清一下吗?提供示例将是优选的。

更新(感谢Shubham提供的链接)

吞下一个中断是可以接受的一次,当您知道线程即将退出时。仅当调用中断方法的类是Thread的一部分,而不是Runnable或通用库代码的一部分时,才发生这种情况,如清单5所示。它创建一个枚举素数的线程,直到被中断为止,并允许该线程中断时退出。寻优循环在两个地方检查中断:一次是通过轮询while循环头中的isInterrupted()方法,一次是当它调用阻塞BlockingQueue.put()方法时。

public class PrimeProducer extends Thread {
    private final BlockingQueue<BigInteger> queue;

    PrimeProducer(BlockingQueue<BigInteger> queue) {
        this.queue = queue;
    }

    public void run() {
        try {
            BigInteger p = BigInteger.ONE;
            while (!Thread.currentThread().isInterrupted())
                queue.put(p = p.nextProbablePrime());
        } catch (InterruptedException consumed) {
            /* Allow thread to exit */
        }
    }

    public void cancel() { interrupt(); }
}
Run Code Online (Sandbox Code Playgroud)

我现在不理解粗体字。

nit*_*.kk 0

假设我们编写了一个实用程序代码,并且有一些 clinet 代码依赖于我们的代码。如果InterruptedException发生,则不应在实用程序方法中(在 try 块中)使用它,应将其抛出,并且InterruptedException清除interrupt标志时,必须通过调用方法将其再次设置为 true interrupt

它的核心代码需要处理发生InterruptedException [更新]时要采取的决策。该核心代码可能取决于中断标志或InterruptedException终止循环、结束线程的执行或任何其他决策。

此外,实用程序或库是从高级客户端代码调用的低级代码。理想情况下,低级别应该传播此类异常,以便让更高级别的代码对其进行管理。