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

2024-01-02

我正在阅读一些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。所以这意味着我们总是期望从队列中获取一个值。但是有人可能希望线程被中断,这就是为什么我们必须在最终从队列中获取值后保存并恢复中断状态。

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

UPDATE:看看take()方法实施。它的第一个声明如下:

public final void acquireInterruptibly(int arg) throws InterruptedException {
    if (Thread.interrupted())
        throw new InterruptedException();
...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

退出前恢复中断的不可取消任务 的相关文章

随机推荐