是"原子"中断检查可能在java?

时间:2016-06-10 07:25:23

标签: java multithreading concurrency interrupt

如果使用以下" idiom"在Java中断,例如from this answer

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

如果take是阻塞操作,如果中断"到达,则暂时不能忽略中断"检查Thread.currentThread().isInterrupted()和电话queue.take()之间?这不是一个" check-than-act"操作?如果是这样,如果线程被中断,它能以某种方式保证在任何情况下都保留循环吗?

可以使用poll with a timeout以便在超时后留下循环但是是否可以检查中断状态并以原子方式对其进行操作?

3 个答案:

答案 0 :(得分:3)

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

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

如果线程被中断,take()操作将立即抛出InterruptedException,同时突破while循环。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  

但是可以检查中断状态并对其采取行动   原子

嗯 - 我不知道你的意思"原子地"这里。我们可以假设您想要像onInterrupt(...)这样的东西吗?

中断意味着"中断"线程,所以所有默认的I / O操作抛出一个InterruptedException,你可以捕获或检查。它使线程有机会停止正常关闭/释放任何锁定的资源。

作为事件处理,您可能希望实现 Cancellable task,您可以在其中处理自己的取消事件(嗯,不是默认的JRE中断)。