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

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

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

Подобно этому вопросу: stackoverflow.com/questions/17494717/…

Eric des Courtis 08.07.2013 19:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
32
1
16 639
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

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

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

Spencer Kormos 22.10.2008 21:21

Проглатывание InterruptedException ставит под угрозу способность приложения отменять действия или завершать работу с своевременной информацией. Подробнее здесь ibm.com/developerworks/library/j-jtp05236

Kumar Abhinav 06.08.2014 14:44

Хотя игнорировать большинство исключений однозначно не стоит. Это яркий пример исключения, которое в некоторых случаях можно игнорировать. Например, когда ссылка на поток существует только в области видимости, непредвиденное поведение невозможно. Мы инженеры-программисты и должны думать сами. Если вы даже не спрашиваете себя, почему лучше всего обрабатывать исключения, вы, вероятно, плохой инженер.

Eldar Kersebaum 28.06.2017 15:03

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

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

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

Из API

Thrown when a thread is waiting, sleeping, or otherwise paused for a long time and another thread interrupts it using the interrupt method in class Thread.

Из javadocs:

Class InterruptedException

Thrown when a thread is waiting, sleeping, or otherwise paused for a long time and another thread interrupts it using the interrupt method in class Thread.

Надеюсь это ответит на твой вопрос.

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

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

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

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

"The most common response to InterruptedException is to swallow it -- catch it and do nothing (or perhaps log it, which isn't any better) -- as we'll see later in Listing 4. Unfortunately, this approach throws away important information about the fact that an interrupt occurred, which could compromise the application's ability to cancel activities or shut down in a timely manner."

"If you catch InterruptedException but cannot rethrow it, you should preserve evidence that the interruption occurred [...]. This task is accomplished by calling interrupt() to "reinterrupt" the current thread."

Спасибо, что подняли этот вопрос. Управление InterruptedExceptions - это PITA, но это важно.

Spencer Kormos 22.10.2008 21:22

Отличная ссылка, но не совсем отвечает на реальный вопрос ОП. В переосмыслении это «почему поток должен быть прерван?», И даны ответы «потому что какой-то другой поток решил». Я предполагаю, что настоящая цель OP заключалась в том, «есть ли что-то в более крупной экосистеме Java, что могло бы вызвать это?». System.exit? Возврат из метода main ()? Солнечные пятна? :-)

Charles Roth 19.03.2019 19:52

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

  • Propagate the exception (possibly after some task-specific cleanup), making your method an interruptible blocking method, too; or
  • Restore the interruption status so that code higher up on the call stack can deal with it.
  • Only code that implements a thread's interruption policy may swallow an interruption request. General-purpose task and library code should never swallow interruption requests.

Другие вопросы по теме