在退出之前恢复中断的不可取消任务

时间:2011-10-13 08:59:33

标签: java multithreading

我正在阅读一些java线程中断,我不明白一些东西。希望有人能解释我。所以,它完成了以下代码

public Integer getInteger(BlockingQueue<Integer> queue) {
    boolean interrupted = false;
    try {
        while (true) {
            try {
                return queue.take();
            } catch (InterruptedException e) {
                interrupted = true;
                // fall through and retry
            }
        }
    } finally {
        if (interrupted)
            Thread.currentThread().interrupt();
    }
}

解释如下:

  

不支持取消但仍然致电的活动   可中断阻止方法必须在循环中调用它们,   检测到中断时重试。在这种情况下,他们应该保存   本地中断状态,并在返回之前恢复,   如清单所示。而不是立即抓住   InterruptedException的。过早设置中断状态可以   导致无限循环,因为大多数可中断阻塞   方法检查进入和抛出时的中断状态   如果已设置,则立即发生InterruptedException。 (可中断的方法   通常在阻止或做任何重大事件之前轮询中断   工作,以便尽可能地响应中断。)

我不明白为什么要在本地保存中断状态 我很高兴听到一些解释。

2 个答案:

答案 0 :(得分:2)

通过设计,该方法无法抛出InterruptedException。所以这意味着我们总是希望从队列中获取一个值。但有人可能希望线程被中断,这就是为什么我们必须保存 - 在我们最终从队列中获取值后恢复被中断的状态。

因此,线程只有在从队列中获取值后才能完成。

更新:查看take()方法实现。它具有以下作为第一个陈述:

public final void acquireInterruptibly(int arg) throws InterruptedException {
    if (Thread.interrupted())
        throw new InterruptedException();
...
}

答案 1 :(得分:1)

由于语句

,循环将完成
return queue.take(); 

这不是一个紧凑的循环,即使它看起来像一个。它只阻塞一个元素,并在可用时立即返回,并在发生中断时重试。