При использовании следующей «идиомы» с прерыванием в Java, например from this answer.Возможна ли «атомная» проверка прерываний в java?
while (!Thread.currentThread().isInterrupted()) {
try {
Object value = queue.take();
handle(value);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
Где take это блокирующая операция, может ли не прерывание игнорироваться на некоторое время, если прерывание «прибывает» между проверкой Thread.currentThread().isInterrupted()
и вызовом queue.take()
? Это не операция «проверка, чем действие»? Если да, можно ли как-то гарантировать, что цикл оставлен в любом случае, если поток прерывается?
Можно использовать poll with a timeout, чтобы цикл оставался после таймаута, , но можно ли проверить состояние прерывания и действовать на него атомарно?
Как может прерываться когда-либо пропущенный вышеуказанный код? Вы понимаете, что queue.take() будет немедленно бросать, если поток прерывается перед вызовом take(), правильно? –
@JBNizet: Я проверил код, и вы правы, методы бросают 'InterruptedException' проверку для перехваченного состояния и бросают. Если вы добавите ответ, я приму его. – user140547