Каждый поток имеет специальный флаг, который содержит состояние прерывания, доступ к нему осуществляется с помощью метода isInterrupted()
. Когда кто-то прерывает поток, этот флаг установлен на true
. Это все. Никакого реального прерывания не происходит до тех пор, пока код, выполняемый этим потоком, не проверит этот флаг и не выбросит InterruptedException
или просто прекратит выполнение потока, если это возможно.
Многие методы в стандартной библиотеке, предназначенные для блокировки текущего потока, время от времени проверяют этот флаг и бросают InterruptedException
, когда они обнаруживают, что установлен флаг. Например, Thread.sleep()
, Thread.join()
, Object.wait()
, Lock.lockInterruptibly()
и многие другие. Следовательно, когда ваш поток периодически проверяет этот флаг явно или блокируется некоторыми из описанных методов, которые проверяют его неявно, он прерывается. В противном случае это не так.
Таким образом, поток с пустым циклом не может быть прерван, так как он не проверяет состояние прерывания. Но добавление прерывания проверку состояния будет исправить:
while (!Thread.currentThread().isInterrupted()) { }
Вызов метода отзывчивым к перерывам также будет работать:
try {
while (true) {
Thread.sleep(timeout);
}
} catch(InterruptedException e) {
// Do nothing, just let the thread exit
}
Там может быть любое количество причин, но все они подпадают под категорию " задача не останавливается, несмотря на ваш запрос на отмену ». Ваш while-true цикл будет одной из тех многих причин. –
@ Erwin, Есть ли у них какие-либо правила \ шаблоны? – Jason
также могут быть отменены любые типы задач, любые шаблоны? – Jason