метод прерывания
Прерывание буквально означает прерывание, но в Java метод Thread.interrupt() фактически каким-то образом уведомляет поток, а не завершает его напрямую. Человек, написавший код, решает, что делать, и обычно мы прерываем поток.
Если поток вызывает метод wait(), wait(long) или wait(long, int) класса Object или метод join(), join(long), join(long, int), Sleep(long) или сон класса (long, int) блокируется во время выполнения метода, его статус прерывания будет очищен, а также он получит InterruptedException.
Если поток блокируется в операции ввода-вывода на прерываемом канале (java.nio.channels.InterruptibleChannel), канал будет закрыт, статус прерывания потока будет установлен, и поток получит ClosedByInterruptException.
Если поток заблокирован в селекторе (java.nio.channels.Selector), будет установлен статус прерывания потока, и он немедленно вернется из операции выбора, возможно, с ненулевым значением, как если бы выбор вызывался пробуждением. Принцип устройства тот же.
Если ни одно из предыдущих условий не было сохранено, будет установлен статус прерывания потока.
Прерывание неактивного потока не имеет никакого эффекта.
обнаружить прерывание
Способ обнаружения прерывания зависит от того, что делает поток.
Если поток вызывает метод, который может генерировать InterruptException, перехватите InterruptException и затем обработайте его в блоке catch (обычно выходя из метода run, чтобы прервать поток).
Если вы вызываете другие методы, вы можете проверить Thread.interrupted во время простоя, чтобы определить, получен ли сигнал прерывания, и обработать его после подтверждения получения сигнала прерывания. InterruptException может быть выброшен для соответствия предыдущему методу обработки.
статус прерывания
Механизм прерывания потока реализован с использованием внутреннего флага состояния прерывания. Статус прерывания устанавливается при вызове метода прерывания() потока (см. описание метода прерывания выше).
Есть два способа получить статус прерывания потока:
Вызов статического метода Thread.interrupted() Помимо возврата статуса прерывания текущего потока, этот метод также очищает статус прерывания текущего потока. Другими словами, если этот метод вызывается дважды подряд, второй вызов вернет false (после того, как первый вызов очистит статус прерывания и до того, как второй вызов проверит статус прерывания, текущий поток снова прерывается. ).
Вызовите метод isInterrupted() указанного потока. Этот метод возвращает только статус прерывания указанного потока, не затрагивая статус прерывания потока.
Есть два способа очистить статус прерывания потока:
Как упоминалось выше, вызов Thread.interrupted()
Когда вызывается метод прерывания() потока, чтобы вызвать InterruptedException, статус прерывания потока очищается одновременно, включая методы wait(), wait(long) или wait(long, int) объекта. класс или метод потока join() , join(long) , join(long, int) , Sleep(long) или Sleep(long, int)