Подтвердить что ты не робот

Какое поведение вызывает прерванное исключение?

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

Из javadocs:

Класс InterruptedException

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

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

Ответ 7

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

Из API

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