Когда на какой-то поток вызывается Thread.interrupt(), что происходит?

Когда в какой-то поток вызывается Thread.interrupt(), что происходит с этим потоком?

Ответ 1

Целевой поток "прерван". В основном, в этом потоке установлен флаг, на который может смотреть поток (с помощью Thread.interrupted()). Если целевой поток в настоящий момент заблокирован на некоторых входах ввода/вывода или Object.wait(), то он пробуждается, соответственно, с помощью InterruptedIOException или InterruptedException.

Прерывание потока - это нежный способ подтолкнуть поток. Он используется, чтобы дать потокам возможность выйти чисто, в отличие от Thread.stop(), что больше похоже на стрельбу по нитке с помощью штурмовой винтовки.

Ответ 3

Вот JDK 1.6 Javadoc:

Прерывает этот поток.

Если текущий поток не является прерывая себя, что всегда разрешено, метод checkAccess этот поток вызывается, что может вызвать SecurityException выброшены.

Если этот поток заблокирован в вызов wait(), wait (long), или wait (long, int) методов Класс объекта или join(), join (long), join (long, int), сон (длинный) или сон (длинный, int), методов этого класса, то его статус прерывания будет очищен и он получит InterruptedException.

Если этот поток заблокирован в I/O операции по прерывистому канала, то канал будет закрыто, состояние прерывания потока будет установлен, и поток будет получите исключение ClosedByInterruptException.

Если этот поток заблокирован в Селектор, затем прерывание потока статус будет установлен, и он вернется сразу после выбора возможно, с ненулевым значение, как если бы селектор вызывается метод пробуждения.

Если ни одно из предыдущих условий удерживайте это прерывание потока статус будет установлен.

Прерывание потока, который не является живые не должны иметь никакого эффекта.

Ответ 4

ZeissS правильна, сигнализация - самый чистый способ сделать это. вы также можете поймать исключение прерывания и очистить его.