семантика флага прерывания потока

У меня возникли проблемы с пониманием семантики флага прерывания потока Java. Насколько я понимаю, флаг должен быть истинным только после того, как поток прерван, и после того, как он установлен в значение true, он не будет снова ложным до тех пор, пока не будет перехвачен InterruptedException или его эквивалент, или флаг не будет явно очищен с помощью .interrupted(). Следовательно, я не могу объяснить, почему следующая программа печатает false:

Thread t = new Thread() {
    @Override
    public void run() {
        try {
            // While await()ing, another thread calls t.interrupt().
            new CyclicBarrier(2).await();
        } finally {
            // I believe I should still be interrupted here, but am not...
            System.out.println(Thread.currentThread().isInterrupted());
        }
    }
};

(Некоторые детали исключены для простоты — предположим, что run() может генерировать исключения.)


person Dan    schedule 19.01.2014    source источник


Ответы (1)


1) Откройте исходный код CyclicBarrier, и вы увидите, что метод await() сбрасывает флаг прерывания, вызывая Thread.currentThread().interrupt(). См. doWait(), который является фактическим применением wait(). На самом деле это то, что говорит javadoc CyclicBarrier.

2) Я не согласен с тем, что флаг прерывания сбрасывается при перехвате InterruptedException

person Evgeniy Dorofeev    schedule 19.01.2014
comment
Нет необходимости проверять исходный код CyclicBarrier, потому что документ Javadoc для CyclicBarrier.await объясняет это поведение: если текущий поток [...] прерывается во время ожидания, выдается InterruptedException, и текущий статус прерывания сбрасывается. - person Erwin Bolwidt; 19.01.2014