Когда выполняется Java Thread.sleep throw InterruptedException? Можно ли игнорировать его? Я не делаю многопоточности. Я просто хочу подождать несколько секунд, прежде чем повторить некоторую операцию.
Когда Java Thread.sleep запускает 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
обычно вызывается, когда сон прерывается.