2010-11-24 3 views
18

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

+2

Точный дубликат больше не существует :-( – 2012-04-06 08:31:48

+1

Если этот вопрос будет повторно открыт, так как его дубликат был удален автором? – Craigy 2012-07-19 19:30:47

ответ

19

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

11

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

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

2

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

6

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

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

1

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

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

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

Смежные вопросы