Недостаток использования флага для остановки вашего потока состоит в том, что если поток ожидает или спит, вам придется ждать, пока он завершит ожидание / спящий режим. Если вы вызываете метод прерывания в потоке, это приведет к тому, что вызов ожидания или ожидания будет завершен с InterruptedException.
(Вторая плохая часть подхода с использованием флагов заключается в том, что в большинстве нетривиальных кодов используются библиотеки, такие как java.util.concurrent, где классы специально предназначены для использования прерывания для отмены. Попытка использовать флаг, свернутый вручную, в задача, переданная Исполнителю, будет неудобной.)
Вызов interrupt () также устанавливает свойство прерывания, которое вы можете использовать в качестве флага, чтобы проверить, выходить ли (если поток не ожидает или не спит).
Вы можете написать метод run потока, чтобы InterruptedException перехватывался вне какой-либо логики цикла, которую выполняет поток, или вы можете перехватить исключение в цикле и близко к вызову, вызвавшему исключение, установив флаг прерывания внутри catch заблокировать исключение InterruptedException, чтобы поток не потерял отслеживание того, что он был прерван. Прерванный поток все еще может сохранять контроль и завершать обработку на своих собственных условиях.
Скажем, я хочу написать рабочий поток, который работает с приращениями, где по какой-то причине находится спящий режим, и я не хочу выходить из спящего режима, чтобы завершить обработку без выполнения оставшейся работы для этого приращения, Я только хочу, чтобы это вышло, если это между приращениями:
class MyThread extends Thread
{
public void run()
{
while (!Thread.currentThread().isInterrupted())
{
doFirstPartOfIncrement();
try {
Thread.sleep(10000L);
} catch (InterruptedException e) {
// restore interrupt flag
Thread.currentThread().interrupt();
}
doSecondPartOfIncrement();
}
}
}
Вот ответ на аналогичный вопрос, включая пример кода.