2010-02-18 2 views
9

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

+1

Можете ли вы уточнить? Мне кажется, документация говорит об этом довольно хорошо: http://java.sun.com/javase/6/docs/api/java/lang/Thread.html # interrupt() Я предполагаю, что есть что-то, что не ясно, хотя, если вы можете уточнить свой вопрос? –

ответ

30

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

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

+1

'InterruptedIOException' маловероятно, это практика. Прерывистый ввод-вывод был включен в Solaris ненадолго, но это просто не стоит. Конечно, реализация специфична для реализации. Обычно (в последнее время) ОС будет иметь какое-то отношение к потокам. –

+7

+1 для объяснения самостоятельно и сравнения выстрелов. – helios

2

Вот JDK 1.6 Javadoc:

Прерывание этой темы.

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

Если поток блокируется в вызове ожидания(), ждать (долго), или ждать (долго, INT) методы класса объектов, или объединения(), присоединиться (длинный), join (long, int), sleep (long), или sleep (long, int), методов данного класса, то его статус будет очищен, а получит Прерывание Исключения.

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

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

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

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

0

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

Смежные вопросы