Прерывание или остановка спальной нити

Как остановить или прервать спящий поток в java.? У меня есть поток, который синхронизирует данные и спит в течение 10 минут в методе run(), если я хочу остановить синхронизацию, остановив поток, когда он спит.? Как это можно достичь?

Ответ 1

Вызвать метод прерывания() в вашем потоке. Это заставит спать отменять и вызывается InterruptedException.

Ответ 2

Вы можете прервать спящий поток с помощью Thread.interrupt(). Теперь остановка потока устарела - что, если поток держит блокировку на что-то? (Был Thread.stop(), но он ВЫСОКО обескуражен).

В качестве альтернативы вместо спящего вы можете ожидать, что ваш поток ожидает уведомления объекта с тайм-аутом и упростит уведомление объекта, если вы хотите, чтобы поток проснулся.

Ответ 3

Суреш, я хочу обратить внимание на один вопрос. interrupt() сами не прерывают поток. Он просто отправляет запрос в поток для прерывания, устанавливая флаг в true. Обычно ваш поток должен обрабатывать политику отмены/прерывания. Это очень подробно описано в Java Concurrecy in Practice, раздел 7.1 "Аннулирование задачи".

Блокирование методов библиотеки, таких как Thread.sleep и Object.wait, пытается обнаружить, когда поток был прерван и возвращен раньше. Они реагируют на прерывание, очищая прерванный статус и бросая InterruptedException.

Ответ 4

Фредерик прав: вызовите Thread.interrupt(); Я просто хотел предупредить вас не использовать stop(), поскольку он устарел с java 1.1. И другое предупреждение. Я думаю, что если вы используете sleep() и хотите прервать поток, это хороший момент подумать о переходе на wait() и notify(). Существует много руководств о потоках java и javadoc java.lang.Thread достаточно хорош, поэтому вы можете продолжить чтение там, если вы не знакомы с этими API.

Ответ 5

Поскольку я не могу комментировать, я отправлю еще один ответ. Я просто хочу укрепить и уточнить, что сказал Александр. interrupt() устанавливает только флаг в Thread, а расширенный объект Thread или Runnable должен проверить, прервано ли оно с помощью Thread.interrupted(), чтобы сделать то, что оно должно было делать, когда прервано.

interrupt() также останавливает wait() или sleep(), но обратите внимание, что эти методы UNSET флаг прерывания. Таким образом, если вы вызываете interrupt() в спящий/ожидающий поток, он перестанет спать/ждать, но не будет знать, что он был прерван, кроме случаев, когда вы поймаете исключение и не будете прерваны.

Я смог исправить мою программу, выполнив свой собственный флаг прерывания, который не мог быть переопределен методами sleep() и wait(). Кроме того, знайте, что вы можете прерывать поток изнутри с помощью Thread.currentThread().interrupt().