Когда Java Thread.sleep запускает InterruptedException?

Когда выполняется Java Thread.sleep throw InterruptedException? Можно ли игнорировать его? Я не делаю многопоточности. Я просто хочу подождать несколько секунд, прежде чем повторить некоторую операцию.

Ответ 1

Обычно вы НЕ игнорируете исключение. Взгляните на следующий документ:

Не проглатывайте прерывания

Иногда бросание InterruptedException не вариант, например, когда задание, заданное Runnable, вызывает прерывистый метод. В этом случае вы не можете бросить вызов InterruptedException, но вы также не хотите ничего делать. Когда блокирующий метод обнаруживает прерывание и бросает InterruptedException, он очищает прерванный статус. Если вы поймаете InterruptedException но не может его воссоздать, вы должны сохранить доказательства того, что произошло прерывание, поэтому код выше в стеке вызовов может узнайте о прерывании и ответьте на него, если захочет. Эта задача выполняется путем вызова прерывания() для "повторного включения" текущего как показано в листинге 3. По крайней мере, всякий раз, когда вы ловите InterruptedException и не восстанавливать его, переинтерпретировать текущий перед возвратом.

public class TaskRunner implements Runnable {
    private BlockingQueue<Task> queue;

    public TaskRunner(BlockingQueue<Task> queue) { 
        this.queue = queue; 
    }

    public void run() { 
        try {
             while (true) {
                 Task task = queue.take(10, TimeUnit.SECONDS);
                 task.execute();
             }
         }
         catch (InterruptedException e) { 
             // Restore the interrupted status
             Thread.currentThread().interrupt();
         }
    }
}

Смотрите всю статью здесь:

http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html?ca=drs-

Ответ 2

Если создается InterruptedException это означает, что что-то хочет прервать (обычно завершить) этот поток. Это инициируется вызовом метода interrupt(). Метод wait обнаруживает это и выдает InterruptedException чтобы код перехвата мог обработать запрос на завершение немедленно и не должен ждать, пока истечет указанное время.

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

} catch (InterruptedException e) {
  Thread.currentThread().interrupt();
  // code for stopping current task so thread stops
}

Который снова устанавливает это состояние. После этого закончите казнь. Это было бы правильным поведением, даже жестким, никогда не использованным.

Что может быть лучше, это добавить это:

} catch (InterruptedException e) {
  throw new RuntimeException("Unexpected interrupt", e);
}

... оператор в блоке catch. Это в основном означает, что это никогда не должно произойти. Так что, если код повторно используется в среде, где это может произойти, он будет жаловаться на это.

Ответ 3

Информационный бюллетень Java Specialists (который я могу безоговорочно рекомендовать) имел интересную статью об этом и как обрабатывать InterruptedException. Это стоит прочитать и переварить.

Ответ 4

Твердый и простой способ обработать его в однопоточном коде - это поймать его и перетащить в RuntimeException, чтобы избежать необходимости объявлять его для каждого метода.

Ответ 5

Методы типа sleep() и wait() класса Thread могут вызывать InterruptedException. Это произойдет, если какой-либо другой Thread хочет прервать Thread, который ждет или спящий.

Ответ 6

InterruptedException обычно вызывается, когда сон прерывается.