Как остановить или прервать спящую нить в java.? У меня есть поток, который синхронизирует данные и спит в течение 10 минут в методе run(), если я хочу остановить синхронизацию, остановив поток, когда он спит.? Как это можно достичь?Прерывание или остановка спальной нити
ответ
Вызвать метод прерывания() в своем потоке. Это приведет к отключению сна и вызову InterruptedException.
Вы можете прервать спящую нить с помощью Thread.interrupt()
. Теперь остановка потока устарела - что, если поток держит блокировку на что-то? (Был Thread.stop()
, но он ВЫСОКО обескуражен).
Альтернативно, вместо спящего вы можете ожидать, что ваш поток ожидает уведомления объекта с помощью тайм-аута и упростит уведомление объекта, если вы хотите, чтобы поток проснулся.
Фредерик направо: вызов Thread.interrupt(); Я просто хотел предупредить вас не использовать stop(), поскольку он устарел с java 1.1. И другие предупреждения. Я думаю, что если вы используете sleep() и хотите прервать поток, это хороший момент подумать о переходе на wait() и notify(). Существует много руководств о потоках java и javadoc java.lang.Thread достаточно хорош, поэтому вы можете продолжить чтение там, если вы не знакомы с этими API.
Суреш, я хочу обратить внимание на один вопрос. interrupt() сами не прерывают поток. Он просто отправляет запрос в поток для прерывания, устанавливая флаг в true. Обычно ваш поток должен обрабатывать политику отмены/прерывания. Это очень подробно описано в Java Concurrecy in Practice, раздел 7.1 «Аннулирование задачи».
Блокировка методов библиотеки, таких как Thread.sleep и Object.wait, пытающихся обнаружить, когда поток был прерван и возвращен раньше. Они реагируют на прерывание, очищая прерванный статус и бросая InterruptedException.
Поскольку я не могу комментировать, я отправлю еще один ответ. Я просто хочу укрепить и уточнить, что сказал Александр. interrupt()
устанавливает только флаг в Thread
, а расширенный объект Thread
или Runnable
должен проверить, был ли он прерван с помощью Thread.interrupted()
, чтобы сделать то, что он должен делать, когда прерывается.
interrupt()
также останавливает wait()
или sleep()
, но обратите внимание, что эти методы UNSET используют флаг прерывания. Таким образом, если вы вызовете interrupt()
в спящем/ожидающем потоке, он перестанет спать/ждать, но не будет знать, что он был прерван, за исключением случаев, когда вы поймаете исключение и не будете прерваны.
Я смог исправить мою программу, реализовав свой собственный флаг прерывания, который не мог быть переопределен методами sleep()
и wait()
. Кроме того, знайте, что вы можете прервать поток изнутри с помощью Thread.currentThread().interrupt()
.
- 1. Отмена спальной нити в C#
- 2. Запуск спальной нити в .NET
- 3. Остановка или прерывание Java-потока
- 4. Остановка и перезапуск нити
- 5. Убийство или остановка активной нити
- 6. Что происходит после просыпания спальной нити?
- 7. Остановка нити
- 8. Прерывание нити из себя
- 9. Прерывание/Убивание текущей нити
- 10. Прерывание бегущей нити
- 11. Прерывание нити в Python
- 12. Прерывание повышающей нити
- 13. Остановка/Прерывание операции
- 14. Остановка нити MFC
- 15. Запуск, остановка нити
- 16. Прерывание нити при воспроизведении музыки
- 17. C#: Остановка нити после Exception
- 18. Как проверить, что ReadFileEx завершил загрузку без спальной нити?
- 19. Спящая внутренняя нить без спальной наружной нити - Java
- 20. Пробуждение спальной нити с помощью SSE eventSource прослушивателя
- 21. Остановка нити при возникновении ACTION_UP
- 22. Остановка нити после согласования состояния
- 23. Остановка нити внутри веб-контейнера
- 24. Windows Form OnClosing Остановка нити
- 25. Какой тип нити использовать, правильный останов/прерывание?
- 26. Остановка рабочей нити при запросе Facebook
- 27. Eclipse RCP: Остановка нити/работу, которая замораживает
- 28. Запуск и остановка процесс нити от отзывной
- 29. Остановка нити в качестве службы Android
- 30. Запуск и остановка нити-JButton Alignment
Точный дубликат больше не существует :-( – 2012-04-06 08:31:48
Если этот вопрос будет повторно открыт, так как его дубликат был удален автором? – Craigy 2012-07-19 19:30:47