Не могли бы вы объяснить, что java.lang.Thread.interrupt()
делает, когда вызывается?
java
multithreading
oneat
источник
источник
Ответы:
Thread.interrupt()
устанавливает прерванный статус / флаг целевого потока. Затем код, выполняющийся в этом целевом потоке, МОЖЕТ опрашивать прерванное состояние и обрабатывать его соответствующим образом. Некоторые методы, которые блокируют, такие как,Object.wait()
могут немедленно потреблять прерванное состояние и выдавать соответствующее исключение (обычноInterruptedException
)Прерывание в Java не является преимущественным. Иными словами, оба потока должны взаимодействовать, чтобы правильно обработать прерывание. Если целевой поток не опрашивает прерванное состояние, прерывание фактически игнорируется.
Опрос происходит с помощью
Thread.interrupted()
метода, который возвращает статус прерывания текущего потока И очищает этот флаг прерывания. Обычно поток может затем сделать что-то, например, бросить InterruptedException.РЕДАКТИРОВАТЬ (из комментариев Thilo): Некоторые методы API имеют встроенную обработку прерываний. Из верхней части моей головы это включает в себя.
Object.wait()
,Thread.sleep()
ИThread.join()
java.util.concurrent
структурInterruptedException
, а не используетClosedByInterruptException
.РЕДАКТИРОВАТЬ (от полноты ответа @ thomas-pornin на тот же вопрос )
Прерывание нити - это мягкий способ подтолкнуть нить. Он используется, чтобы дать возможность нитям выйти чистого , в отличие от того,
Thread.stop()
что больше похоже на стрельбу из винтовки.источник
Что такое прерывание?
Как это реализовано?
Цитата из
Thread.interrupt()
API :Проверьте это для полного понимания о том же:
http://download.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
источник
Если целевой поток ожидал (вызывая
wait()
или с помощью других связанных методов, которые, по сути, делают то же самое, напримерsleep()
), он будет прерван, что означает, что он перестает ожидать того, что ожидал, и вместо этого получает InterruptedException.Это полностью зависит от самого потока (код, который вызвал
wait()
), чтобы решить, что делать в этой ситуации. Это не автоматически завершает поток.Иногда используется в сочетании с флагом завершения. При прерывании поток может проверить этот флаг, а затем отключиться. Но опять же, это просто соглашение.
источник
Для полноты, в дополнение к другим ответам, если поток прерывается до того, как он блокируется
Object.wait(..)
илиThread.sleep(..)
т. Д., Это эквивалентно тому, что он прерывается сразу после блокировки этого метода , как показано в следующем примере.Вывод:
Вывод: если вы выполняете цикл, как показано ниже, и прерывание происходит в тот самый момент, когда управление ушло
Thread.sleep(..)
и обходит цикл, исключение все равно будет происходить. Поэтому совершенно безопасно полагаться на то, что InterruptedException будет надежно выдан после прерывания потока :источник
Thread.interrupt()
устанавливает прерванный статус / флаг целевого потока в значение true, что при проверке с помощьюThread.interrupted()
может помочь остановить бесконечный поток. См. Http://www.yegor256.com/2015/10/20/interrupted-exception.htmlисточник
Прерывание потока основано на статусе прерывания флага . Для каждого потока значение по умолчанию статуса прерывания установлено в false . Всякий раз, когда метод interrupt () вызывается в потоке, статус прерывания устанавливается равным true .
источник
public void interrupt ()
Прерывает эту тему.
Если текущий поток не прерывает сам себя, что всегда разрешено, вызывается метод checkAccess этого потока, что может привести к возникновению исключения SecurityException.
Если этот поток заблокирован при вызове методов wait (), wait (long) или wait (long, int) класса Object или join (), join (long), join (long, int) , sleep (long) или sleep (long, int), методы этого класса, тогда его состояние прерывания будет очищено, и он получит InterruptedException.
Если этот поток заблокирован в операции ввода-вывода для прерываемого канала, то канал будет закрыт, состояние прерывания потока будет установлено, и поток получит исключение ClosedByInterruptException.
Если этот поток заблокирован в селекторе, то будет установлено состояние прерывания потока, и он немедленно вернется из операции выбора, возможно, с ненулевым значением, как если бы был вызван метод пробуждения селектора.
Если ни одно из предыдущих условий не выполняется, то состояние прерывания этого потока будет установлено.
Прерывание потока, который не является живым, не должно иметь никакого эффекта.
Выдает: SecurityException - если текущий поток не может изменить этот поток
источник
Прерывание - это указание потоку, что он должен остановить то, что он делает, и сделать что-то еще. Программист должен решить, как именно поток реагирует на прерывание, но очень часто поток завершается. Очень хорошая ссылка: https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
источник
Метод Thread.interrupt () устанавливает внутренний флаг «статус прерывания». Обычно этот флаг проверяется методом Thread.interrupted ().
По соглашению любой метод, который существует через InterruptedException, должен очистить флаг состояния прерывания.
источник