【发布时间】:2017-02-14 06:59:50
【问题描述】:
我在实践中阅读了并发性。现在我想了解如何处理InterrruptedException
书中的建议:
- 传播异常(可能在一些特定于任务的清理之后), 使您的方法也成为可中断的阻塞方法;或
- 恢复中断状态,以便调用堆栈上更高的代码可以 处理它。
- 仅实现线程中断策略的代码 可能会吞下中断请求。通用任务和库 代码不应该吞下中断请求。
前两个陈述对我来说很清楚,但我不明白第三个。你能澄清一下吗?最好提供例子。
更新(感谢 Shubham 的链接)
有一次可以接受中断是当你知道 线程即将退出。 这种情况只发生在类 调用可中断方法是 线程的一部分,而不是 Runnable 或通用库代码,如清单 5 所示。 创建一个枚举素数的线程,直到它被中断 并允许线程在中断时退出。寻求主力 循环在两个地方检查中断:一次通过轮询 isInterrupted() 方法在 while 循环的头部和一次 when 它调用阻塞的 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(); }
}
我现在看不懂粗体字。
【问题讨论】:
-
如果非核心代码要吞下一个中断请求,那么依赖该信号的任何其他人都可能被抛弃,这是不希望发生的。这是我的猜测。
-
较低级别的代码应该传播此类异常以让较高级别的代码管理它们。请参考下面我的回答,希望对您有所帮助。
-
我不认为
PrimeProducer是应该吞下中断的代码的一个很好的例子。虽然您可能希望代码直接作为线程调用,但没有理由只像这样使用它:您可以在要使用Runnable的任何地方使用它的实例。因此,您不确定线程即将退出。中断标志应该在那里恢复;这样做有什么害处?它不影响“直接线程”用例,并修复了“间接”使用。 -
@gstackoverflow 这意味着我不应该批判性地思考它吗?我只是在举例说明这似乎不起作用。
标签: java concurrency interrupted-exception