В Java поток представлен классом
Thread. В нём есть метод
stop(), но пользоваться им нельзя, метод помечен как deprecated. Такая жесткая остановка моментально возвращает все захваченные потоком
мониторы, и защищенные ими данные могут оказаться в неконсистентном состоянии.
Разработчики
рекомендуют вместо этого использовать флаг, который будет показывать о намерении остановить поток. Флаг выставляется извне потока, а внутри проверяется в подходящий момент. Если нужно остановиться, поток просто выходит из метода
run(). В качестве такого флага подойдет переменная типа
AtomicBoolean.
Когда в потоке используются блокирующие операции, обычно для определенного типа операции существует свой способ её прервать. Например, можно закрыть сокет, на котором поток ожидает. Для большинства блокирующих операций сработает метод
Thread.interrupt(). С его помощью можно прервать
Object.wait() и операции из
NIO.
Останется только правильно обработать такое прерывание. Прерванный
wait() выбросит
InterruptedException,
Selector.select() вернет результат. Чтобы отличить осознанное прерывание с целью завершить тред от какого-либо другого, его обработку всё ещё необходимо снабдить проверкой флага.