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

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

4 ответа

Решение

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

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

Вот JDK 1.6 Javadoc:

Прерывает эту тему.

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

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

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

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

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

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

Javadoc для этого метода объясняет, что происходит в какой ситуации.

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

Другие вопросы по тегам