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

InterruptedException: что вызывает это?

Есть интересные вопросы и ответы относительно Java InterruptedException, например Причина InterruptedException и Обработка InterruptedException в Java. Однако ни один из них не рассказывает мне о возможных источниках InterruptedException.

Как насчет сигналов ОС, таких как SIGTERM, SIGQUIT, SIGINT? Нажимает ли CTRL-C в командной строке InterruptedException? Что еще?

4b9b3361

Ответ 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(), но имейте в виду последствия этого в конечном итоге, особенно если вы в конечном итоге повторно используете этот код в других контекстах.