Они рекомендуют использовать общую переменную в качестве флага, который запрашивает остановку фонового потока. Затем эта переменная может быть установлена другим объектом, запрашивающим завершение потока.
В Java потоки не прерываются, но остановка потока выполняется совместным способом. Потоку предлагается завершить работу, и затем поток может завершиться корректно.
Часто используется volatile boolean поле, которое поток периодически проверяет и завершает работу, когда ему присваивается соответствующее значение.
Я бы не использовал a boolean для проверки, должен ли поток завершаться. Если вы используете volatile в качестве модификатора поля, это будет работать надежно, но если ваш код становится более сложным, поскольку вместо этого внутри while цикла используются другие методы блокировки, может случиться, что ваш код не завершится вообще или, по крайней мере, займет больше времени, чем вам хотелось бы.
Некоторые методы блокирующей библиотеки поддерживают прерывание.
У каждого потока уже есть логический флаг состояние прерывания, и вы должны использовать его. Это может быть реализовано следующим образом:
Исходный код адаптирован из Java Concurrency на практике. Поскольку cancel() метод является общедоступным, вы можете позволить другому потоку вызывать этот метод по своему усмотрению.
Ответ 4
Один из способов - установить переменную класса и использовать ее в качестве стража.