【问题标题】:Which code can swallow interruptedException?哪个代码可以吞下interruptedException?
【发布时间】: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


【解决方案1】:

简短回答: 能应付的话,就任其吞食吧。

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

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

【讨论】:

    【解决方案2】:

    ExecutorService 将是第三个语句的示例。

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

    如果一个可运行对象在执行时被中断,该中断不应影响后续可运行对象的执行。

    因此,ExecutorService 应该吞下中断,并从被中断的可运行对象的角度适当地处理它,以便允许将线程重用于下一个可运行对象。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2010-10-27
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 2011-09-15
        • 1970-01-01
        • 1970-01-01
        • 2011-10-01
        相关资源
        最近更新 更多