我在实践中阅读了相关内容。现在我想了解如何处理InterrruptedException
书中的建议:
- 传播异常(可能在某些特定于任务的清理之后), 使你的方法成为可中断的阻塞方法;或
- 恢复中断状态,以便调用堆栈上的代码可以更高 处理它。
- 仅实现线程中断策略的代码 可能会吞下中断请求。通用任务和库 代码永远不应该吞下中断请求。
前两个陈述对我来说很清楚,但我不明白第三个。你能澄清一下吗?优选提供示例。
有一次可以接受中断是你知道的 线程即将退出。 此方案仅在课程时发生 调用可中断方法是线程的一部分,而不是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(); }
}
我现在不理解粗体文字。
答案 0 :(得分:1)
ExecutorService
将是第三个陈述的一个例子。
这将在同一个“实际”线程上协调多个runnables(/ callables)的执行。
如果一个runnable在执行时被中断,那么该中断不应该影响后续runnable的执行。
因此,ExecutorService
应该吞下中断,从中断的runnable的角度处理它,以便允许重用下一个runnable的线程。
答案 1 :(得分:0)
假设我们编写了一个实用程序代码,并且有一些clinet代码依赖于我们的代码。如果发生InterruptedException
,则不应该在实用程序方法中使用它(在try块中),它应该被抛出,并且当InterruptedException
清除interrupt
标志时,它必须被设置通过调用interrupt
方法再次为真。
它的核心代码需要处理InterruptedException
[更新] 时出现的决定。此核心代码可能取决于中断标志或{{ 1}}终止循环,结束线程的执行或任何其他决定。
此外,实用程序或库是从高级客户端代码调用的低级代码。理想情况下,低级别应该传播此类异常,以便让更高级别的代码管理它。
答案 2 :(得分:0)
简短回答: 如果你可以处理这种情况,就可以吞下它。
当并行线程中发生的进程被取消或中断时,会发生中断的异常。所以,如果你是唯一一个对这个事实感兴趣的人,并且你可以处理那个线程“死”的情况,那么你可以吞下它。
在现实生活中的例子中,这是完全可能的。战略取决于每种情况。