Устанавливает ли InterruptedIOException флаг прерывания потока в значение true? - PullRequest
0 голосов
/ 14 февраля 2019

В моем коде возникла прерванная исключительная ситуация, и я пытаюсь понять, почему.

В результате получается, что я пытаюсь создать файлы в каком-либо месте моей файловой системы, вызывая FilesUtils.filesMethod ()..

Если я получаю IOException, я пытаюсь спать в течение 100 мс.Во время сна мне нужно проверить, не прерываюсь ли я (потому что InterruptedException - это исключение проверки со сном).

если так, я печатаю «Got interrupted» и получаю для флага прерывания текущего потока значение true.

Я получаю сообщение "Got interrupted" в моем журнале.

Нигде в моем коде нет команды interrput () для этого потока.

что это может быть?

мог бы этот senario иметь смысл:

  1. метод ilesUtils.filesMethod () выбрасывает InterruptedIOException, потому что поток был закрыт под потоками потоков.Кроме того, это InterruptedIOException устанавливает для флага прерывания значение true.

  2. Я ловлю InterruptedIOException в своем улове (IOException e).

  3. Сон проверяет, не прерван лифлаг это правда.это так (см. 1), поэтому он создает исключение InterruptedException.

Может ли это иметь место?

        try {
            FilesUtils.filesMethod();
            break;
        } catch (IOException e) {
            try {
                TimeUnit.MILLISECONDS.sleep(100);
            } catch (InterruptedException e1) {
                log.info("Got interrupted", e1);
                Thread.currentThread().interrupt();
            }
        }

1 Ответ

0 голосов
/ 14 февраля 2019

Не зная деталей реализации Вашего FilesUtils.filesMethod(), мы можем только догадываться, что здесь происходит.Но простое бросание InterruptedIOException не приводит к установке флага прерывания.

Я предполагаю, FilesUtils.filesMethod() устанавливает флаг interrupt перед броском InterruptedIOException, а затем sleepInterruptedException (поскольку установлен флаг прерывания).

Вы можете очистить флаг прерывания с помощью Thread.interrupted () перед вызовом метода сна (если вы хотите иметь возможность спать в этомдело).Поэтому метод сна не выдает InterruptedException. (Если поток не прерывается снова)

...