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




Хорошо, если какой-то другой поток вызывает thread.interupt (), пока поток спит, вы получите исключение. И да, вы, вероятно, можете просто поставить try..catch вокруг sleep () и игнорировать его;)
Понижен, потому что вы должны никогда игнорировать любое исключение, это приводит к недокументированному поведению и ошибкам. Либо зарегистрируйте это, либо всплесните.
Проглатывание InterruptedException ставит под угрозу способность приложения отменять действия или завершать работу с своевременной информацией. Подробнее здесь ibm.com/developerworks/library/j-jtp05236
Хотя игнорировать большинство исключений однозначно не стоит. Это яркий пример исключения, которое в некоторых случаях можно игнорировать. Например, когда ссылка на поток существует только в области видимости, непредвиденное поведение невозможно. Мы инженеры-программисты и должны думать сами. Если вы даже не спрашиваете себя, почему лучше всего обрабатывать исключения, вы, вероятно, плохой инженер.
Первичный случай - это когда кто-то вызывает 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, но это важно.
Отличная ссылка, но не совсем отвечает на реальный вопрос ОП. В переосмыслении это «почему поток должен быть прерван?», И даны ответы «потому что какой-то другой поток решил». Я предполагаю, что настоящая цель OP заключалась в том, «есть ли что-то в более крупной экосистеме Java, что могло бы вызвать это?». System.exit? Возврат из метода main ()? Солнечные пятна? :-)
Некоторые советы от 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.
Подобно этому вопросу: stackoverflow.com/questions/17494717/…