Ответ 1
Ни одна из вещей, которые вы перечисляете, не производит InterruptedException
.
Единственное, что может прервать поток, - это вызов Thread#interrupt()
. JLS относительно понятен в этом вопросе, из раздела 17.2.3:
17.2.3 Перерывы
Действия прерывания происходят при вызове
Thread.interrupt
, а также методы, определенные для вызова в свою очередь, напримерThreadGroup.interrupt
.
См. официальное руководство по прерываниям для получения дополнительной информации. В частности:
Поток отправляет прерывание, вызывая
interrupt
объектаThread
для прерывания потока. Чтобы механизм прерывания работал правильно, прерванный поток должен поддерживать собственное прерывание....
Механизм прерывания реализуется с использованием внутреннего флага, известного как статус прерывания. Вызов
Thread.interrupt
устанавливает этот флаг. Когда поток проверяет прерывание, вызывая статический методThread.interrupted
, состояние прерывания очищается. Нестатический методisInterrupted
, который используется одним потоком для запроса статуса прерывания другого, не меняет флаг состояния прерывания.По соглашению, любой метод, который выходит, бросая
InterruptedException
, удаляет статус прерывания, когда он это делает. Тем не менее, всегда возможно, что статус прерывания будет немедленно установлен снова, другим потоком, вызывающимinterrupt
.
Импликация заключается в том, что он является явным флагом, устанавливаемым только путем вызова interrupt()
, а не запускаемого другими неизвестными внешними событиями. Это дополнительно подразумевается описанием исключения в различных методах, которые его бросают, например (выделение мое):
InterruptedException
- , если какой-либо поток прервал текущий поток. Прерванный статус текущего потока очищается при этом исключении.
Цель системы прерывания в общем состоит в том, чтобы обеспечить общую, четко определенную структуру, позволяющую потокам прерывать задачи (потенциально трудоемкие) в других потоках. Хотя вы можете реализовать аналогичные функции с явной логикой в своем собственном приложении, наличие этого четко определенного механизма позволяет независимым классам (например, JDK, другому стороннему коду, другим независимым классам в вашем собственном коде) обеспечивать эту функциональность согласованным образом.
Многие примечания и "предупреждения", которые вы видите по поводу обработки InterruptedException
, не означают, что они могут быть выброшены полностью спонтанно, они предназначены для поощрения хорошо продуманных объектов, которые могут использоваться в неизвестных контекстах все же, где interrupt()
будет предполагаться работать (так что вы действительно хотите предположить, что они могут быть вызваны спонтанно, если вы создаете многоразовые объекты, которые будут надежными в будущих ситуациях - то есть вы никогда не гарантируете, что ваш код выиграет ' в какой-то день используется кем-то, кто ожидает, что прерывания будут работать).
Для быстрых одноразовых проектов вам действительно не нужно беспокоиться об особой обработке для этих исключений, если вы точно знаете, что вы не вызываете interrupt()
и не вызываете то, что может вызвать interrupt()
, но имейте в виду последствия этого в конечном итоге, особенно если вы в конечном итоге повторно используете этот код в других контекстах.