Проблема с установкой флага и наличием потока, периодически проверяющего флаг на прерывание потока диска, заключается в том, что, если ваш поток вызывает долгосрочный API-метод или метод блокировки, такой как метод put для полного BlockingQueue что никогда не будет удалено из-за того, что поток, который должен был его удалить, был остановлен или заблокировал чтение из сокета, который также никогда не будет записан? Во всех таких случаях ни один из этих длительных вызовов никогда не остановится для проверки вашего флага, и ваше приложение может зависнуть.
Правильный способ прерывания потока состоит в том, чтобы выполнить метод Thread.interrupt () в этом экземпляре потока, а в самом запущенном потоке вы должны периодически проверять Thread.currentThread (). IsInterrupted (), чтобы определить, является ли поток должно быть прервано и, конечно, перехватить InterruptedException и выполнить упорядоченное завершение работы, если оно будет выдано.
Преимущество этого подхода состоит в том, что если ваш поток вызывает долгосрочный метод, надеюсь, этот метод также будет периодически проверять Thread.currentThread (). IsInterrupted () и будет отвечать на запрос прерывания, выполняя упорядоченное выполнение. завершение работы и распространение InterruptedException. Например, BlockingQueue.put действительно обнаружит запрос прерывания, выданный Thread.interrupt (). Сокеты не будут обнаруживать запрос прерывания, но будут реагировать на закрытие сокета, что можно сделать в переопределенном методе interrupt () потока.
Поскольку на самом деле нет способа вызвать метод interrupt () в анонимном потоке, вам, вероятно, не следует использовать их для длительных задач.
Рекомендую прочитать "Параллелизм Java на практике". Это отличная книга, и глава 7 «Отмена и завершение» посвящена подобным вещам. Это объясняет это намного лучше, чем я.