Какое поведение вызывает прерванное исключение? - PullRequest
30 голосов
/ 22 октября 2008

Я относительно новичок в Threading в Java и заметил, что каждый раз, когда я использую Thread.sleep (), я должен ловить InterrupetdException.

Какое поведение вызывает это, и в простых приложениях, где у меня есть поток монитора, я могу просто игнорировать исключение?

Ответы [ 7 ]

27 голосов
/ 22 октября 2008

Это происходит, когда что-то вызывает interrupt () в потоке. Эта статья Брайана Гетца объясняет механизм прерывания и как вы должны обрабатывать InterruptedExceptions:

"Наиболее распространенный ответ на InterruptedException - проглотить его - поймать его и ничего не делать (или, возможно, зарегистрировать, что не лучше) - как мы увидим позже в листинге 4. К сожалению, этот подход выбрасывает важную информацию о том, что произошло прерывание, которое может поставить под угрозу способность приложения отменять действия или своевременно завершать работу. "

"Если вы перехватываете InterruptedException, но не можете повторно его выбросить, вам следует сохранить свидетельство того, что прерывание произошло [...]. Эта задача выполняется путем вызова interrupt () для« повторного прерывания »текущего потока."

8 голосов
/ 22 октября 2008

Как уже говорили другие, это вызвано тем, что какой-то другой поток вызывает interrupt() для Thread объекта, который спит.

Что это означает на простом английском, так это то, что какой-то другой поток решил отменить спящий поток. Здесь есть блок try / catch, так что вы можете корректно обработать отмену потока и безопасно очистить любые ресурсы или завершить все операции, которые выполнялись правильно.

Если вам на самом деле ничего не нужно делать, тогда да, вам все еще нужен пустой блок catch. Но это Java для вас ...

6 голосов
/ 22 октября 2008

Несколько советов от Java Concurrency на практике:

  • Распространение исключения (возможно, после некоторой очистки для конкретной задачи), что делает ваш метод также методом прерываемой блокировки; или
  • Восстановите статус прерывания, чтобы код, находящийся выше в стеке вызовов, мог с ним справиться.
  • Только код, который реализует политику прерывания потока, может проглотить запрос прерывания. Универсальный код задачи и библиотеки никогда не должен проглатывать запросы прерывания.
3 голосов
/ 22 октября 2008

Из Javadocs :

Класс InterruptedException

Брошенный, когда поток ожидает, спать или иным образом сделать паузу для долгое время и другой поток прерывает его с помощью прерывания метод в классе Thread.

Надеюсь, что ответит на ваш вопрос.

3 голосов
/ 22 октября 2008

Основной случай, когда кто-то вызывает Thread.interrupt () в вашем потоке.

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

0 голосов
/ 22 октября 2008

InterruptedException является проверенным исключением, поэтому, к сожалению, вы не можете просто проигнорировать его. В большинстве простых случаев вам не нужно ничего делать в предложении catch, потому что вы уверены, что этого не произойдет.

Из API

Брошенный, когда поток ждет, спит или иным образом приостанавливается на долгое время, и другой поток прерывает его, используя метод прерывания в классе Thread.

0 голосов
/ 22 октября 2008

Хорошо, если какой-то другой поток вызывает thread.interupt (), пока поток спит, вы получите исключение. И да, вы, вероятно, можете просто поставить try..catch arround sleep () и игнорировать его;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...