是否可以在java中进行“原子”中断检查?

如果在Java中使用以下“成语”,例如从此答案中。

while (!Thread.currentThread().isInterrupted()) {
    try {
        Object value = queue.take();
        handle(value);
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
}

如果take是阻塞操作,那么如果在Thread.currentThread().isInterrupted()和调用queue.take()之间的中断“到达”之间暂时不会忽略中断Thread.currentThread().isInterrupted() 这不是一个“检查行动”吗? 如果是这样,如果线程中断,是否可以保证循环被留在任何情况下?

有可能使用轮询超时,以便在超时后留下循环, 但可以检查中断状态并自动对其执行操作吗?


我会交换try / catch和while循环:

try {
  while (true) {
    Object value = queue.take();
    handle(value);
  }
} catch (InterruptedException e) {
  Thread.currentThread().interrupt();
}

如果线程中断, take()操作会立即抛出一个InterruptedException ,并且同时打破while循环。


只有一个调用可以清除中断标志,因此isInterrupted和queue.take()之间不会发生任何事情。


但是是否可以检查中断状态并自动执行

那么 - 我不知道你在这里的意思是“原子地”。 我们可以假设你想要类似onInterrupt(...)?

中断是为了“中断”线程,所以所有默认的I / O操作都会抛出一个InterruptedException,您可以捕获或检查它。 它使线程有机会停止正常关闭/释放任何锁定的资源。

作为事件处理,你可能想要实现一个可取消任务,在那里你可以处理你自己的取消事件(当然,不是默认的JRE中断)。

链接地址: http://www.djcxy.com/p/34509.html

上一篇: Is an "atomic" interrupt check possible in java?

下一篇: What is POCO in Entity Framework?