Ответ 1
Вызвать метод прерывания() в вашем потоке. Это заставит спать отменять и вызывается InterruptedException.
Как остановить или прервать спящий поток в java.? У меня есть поток, который синхронизирует данные и спит в течение 10 минут в методе run(), если я хочу остановить синхронизацию, остановив поток, когда он спит.? Как это можно достичь?
Вызвать метод прерывания() в вашем потоке. Это заставит спать отменять и вызывается InterruptedException.
Вы можете прервать спящий поток с помощью Thread.interrupt()
. Теперь остановка потока устарела - что, если поток держит блокировку на что-то? (Был Thread.stop()
, но он ВЫСОКО обескуражен).
В качестве альтернативы вместо спящего вы можете ожидать, что ваш поток ожидает уведомления объекта с тайм-аутом и упростит уведомление объекта, если вы хотите, чтобы поток проснулся.
Суреш, я хочу обратить внимание на один вопрос. interrupt() сами не прерывают поток. Он просто отправляет запрос в поток для прерывания, устанавливая флаг в true. Обычно ваш поток должен обрабатывать политику отмены/прерывания. Это очень подробно описано в Java Concurrecy in Practice, раздел 7.1 "Аннулирование задачи".
Блокирование методов библиотеки, таких как Thread.sleep и Object.wait, пытается обнаружить, когда поток был прерван и возвращен раньше. Они реагируют на прерывание, очищая прерванный статус и бросая InterruptedException.
Фредерик прав: вызовите Thread.interrupt(); Я просто хотел предупредить вас не использовать stop(), поскольку он устарел с java 1.1. И другое предупреждение. Я думаю, что если вы используете sleep() и хотите прервать поток, это хороший момент подумать о переходе на wait() и notify(). Существует много руководств о потоках java и javadoc java.lang.Thread достаточно хорош, поэтому вы можете продолжить чтение там, если вы не знакомы с этими API.
Поскольку я не могу комментировать, я отправлю еще один ответ. Я просто хочу укрепить и уточнить, что сказал Александр. interrupt()
устанавливает только флаг в Thread
, а расширенный объект Thread
или Runnable
должен проверить, прервано ли оно с помощью Thread.interrupted()
, чтобы сделать то, что оно должно было делать, когда прервано.
interrupt()
также останавливает wait()
или sleep()
, но обратите внимание, что эти методы UNSET флаг прерывания. Таким образом, если вы вызываете interrupt()
в спящий/ожидающий поток, он перестанет спать/ждать, но не будет знать, что он был прерван, кроме случаев, когда вы поймаете исключение и не будете прерваны.
Я смог исправить мою программу, выполнив свой собственный флаг прерывания, который не мог быть переопределен методами sleep()
и wait()
. Кроме того, знайте, что вы можете прерывать поток изнутри с помощью Thread.currentThread().interrupt()
.