Зачем вызывать метод Thread.currentThread.interrupt()
в блоке catch?
источник
Зачем вызывать метод Thread.currentThread.interrupt()
в блоке catch?
Это сделано, чтобы сохранить состояние .
Когда вы ловите InterruptException
и проглатываете его, вы по существу не допускаете, чтобы любые методы / группы потоков более высокого уровня замечали прерывание. Что может вызвать проблемы.
Вызывая Thread.currentThread().interrupt()
, вы устанавливаете флаг прерывания потока, так что обработчики прерываний более высокого уровня заметят это и могут обработать это соответствующим образом.
Java Concurrency на практике обсуждает это более подробно в главе 7.1.3: Реагирование на прерывание . Его правило таково:
Только код, который реализует политику прерывания потока, может проглотить запрос прерывания. Универсальный код задачи и библиотеки никогда не должен поглощать запросы прерывания.
InterruptedException
очищенное состояние прерывания, когда это делает. Я думаю, что это делает ответ более понятным с точки зрения того, почему вам нужно сохранять состояние прерывания.interrupt()
вызов - это единственный способ установить флаг прерывания, как только вы получили уведомление об этом состоянии через другой «механизм доставки» -InterruptedException
и он желает или не может повторно его выбросить.Я думаю, что этот пример кода проясняет ситуацию. Класс, который делает работу:
Основной класс:
Попробуйте вызвать прерывание без возврата статуса.
источник
Примечание:
http://download.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html
Как мне остановить поток, который ждет в течение длительного времени (например, для ввода)?
Это гарантирует, что Поток повторно вызовет InterruptedException, как только сможет.
источник
Я бы посчитал это плохой практикой или хотя бы немного рискованной. Обычно методы более высокого уровня не выполняют блокирующих операций и никогда их
InterruptedException
там не увидят . Если вы маскируете его в каждом месте, где выполняете прерываемую операцию, вы никогда не получите его.Единственное обоснование
Thread.currentThread.interrupt()
и отсутствие вызова любого другого исключения или запроса прерывания каким-либо другим способом (например, установкаinterrupted
переменной локальной переменной в главном цикле потока) - это ситуация, когда вы действительно ничего не можете сделать с исключением, как вfinally
блоках.См. Ответ Петера Тёрока, если вы хотите лучше понять значение этого
Thread.currentThread.interrupt()
звонка.источник
См. Документ Java
Итак, если вы измените метод sleepBabySleep () в @Ajay George Ответ на операцию ввода-вывода или просто на sysout, вам не нужно возвращать статус обратно, чтобы остановить программу. (Кстати, они даже не генерируют InterruptedException)
Точно так же, как сказал @ Петер Тёрёк => Это сделано для сохранения состояния. (И особенно для метода, который будет генерировать InterruptedException)
источник