是否可以在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