哪个代码可以吞下interruptException?

时间:2017-02-14 06:59:50

标签: java concurrency interrupted-exception

我在实践中阅读了相关内容。现在我想了解如何处理InterrruptedException

书中的建议:

  

- 传播异常(可能在某些特定于任务的清理之后),   使你的方法成为可中断的阻塞方法;或
   - 恢复中断状态,以便调用堆栈上的代码可以更高   处理它。
   - 仅实现线程中断策略的代码   可能会吞下中断请求。通用任务和库   代码永远不应该吞下中断请求。

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

更新(感谢Shubham的链接)

  

有一次可以接受中断是你知道的   线程即将退出。 此方案仅在课程时发生   调用可中断方法是线程的一部分,而不是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(); }
}

我现在不理解粗体文字。

3 个答案:

答案 0 :(得分:1)

ExecutorService将是第三个陈述的一个例子。

这将在同一个“实际”线程上协调多个runnables(/ callables)的执行。

如果一个runnable在执行时被中断,那么该中断不应该影响后续runnable的执行。

因此,ExecutorService应该吞下中断,从中断的runnable的角度处理它,以便允许重用下一个runnable的线程。

答案 1 :(得分:0)

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

它的核心代码需要处理InterruptedException [更新] 时出现的决定。此核心代码可能取决于中断标志或{{ 1}}终止循环,结束线程的执行或任何其他决定。

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

答案 2 :(得分:0)

简短回答: 如果你可以处理这种情况,就可以吞下它。

当并行线程中发生的进程被取消或中断时,会发生中断的异常。所以,如果你是唯一一个对这个事实感兴趣的人,并且你可以处理那个线程“死”的情况,那么你可以吞下它。

在现实生活中的例子中,这是完全可能的。战略取决于每种情况。