Я думаю, что убийство thread
в то время, когда вы хотите, является проблемой для многих людей. Недавно я наткнулся на способ убить thread
, бросив exception
. Каковы ваши мысли/материалы по этому поводу? Кто-нибудь реализовал что-то подобное раньше?Убивать поток Java, бросая исключение
ответ
Самым лучшим способом, чтобы остановить поток, чтобы бросить InterruptedException
изнутри нити. Если выбрано исключение, это гарантирует, что выполняются блоки catch
и finally
, поэтому поток может освобождать блокировки и ресурсы, закрывать файлы и соединения, которые он открыл, и т. Д.
Часто вы хотите остановить поток от другого нить. Вы должны не использовать метод Thread.stop()
, так как он немедленно останавливает поток, что приводит к взаимоблокировкам, когда закрытая нить по-прежнему принадлежит замкам, файлы, которые никогда не закрываются, и т. Д. «Официальным» способом остановить поток является вызов interrupt()
метод в потоке, который вы хотите остановить. Это устанавливает внутренний флаг, который может быть проверен на Thread.interrupted()
. Каждый поток должен теперь опрашивает Thread.interrupted()
в удобное время и бросить InterruptedException
если флаг установлен:
if (Thread.interrupted()) throw new InterruptedException();
Из комментариев вы должны были понять, что проблема OP заключается именно в том, что у него нет гарантии, что поток, который будет остановлен, когда-либо достигнет точки «удобного времени». –
@ErwinSmout. В самом деле? Я вижу один комментарий от OP, который 1) был добавлен, когда я печатал свой ответ, поэтому я не читал его раньше, и 2), похоже, не говорит, что вы утверждаете, он говорит, только он хочет, чтобы поток остановить «в определенное время». Дело в том, что вы не можете * безопасно * остановить поток в точное время, потому что вам нужно дать время потока для очистки, и любой хороший ответ должен указать на это. – Hoopje
Вы не должны убивать нить. Вы должны остановить его. Если у вас есть цикл, вы должны остановить этот цикл. Если у вас есть некоторая трудоемкая функция, например, подключение к сети, вы должны остановить эту сетевую функцию, а не убивать поток. Там нет никакой гарантии, чтобы остановить поток с Thread.stop()
функцией
Oh 'Thread.stop()' остановит поток просто отлично (если менеджер безопасности не предотвратит его). Это просто не очень мило. – Kayaman
Возможно. но сама функция устарела. это означает, что вы не должны его использовать. Даже функция может быть удалена из jre в какой-то момент. http://10kloc.wordpress.com/2013/03/03/java-multithreading-steeplechase-stopping-threads/ – Adem
Точно, вы не должны использовать его, потому что у него есть проблемы. Однако маловероятно, что он будет удален (хотя теоретически это может быть). Это принесет больше вреда, чем пользы. – Kayaman
- 1. Убивать поток мгновенно в Java
- 2. Бросив исключение, бросая исключение
- 3. Убивать * нерешительный * поток в Android/Java
- 4. проблема с fakeiteasy, бросая исключение
- 5. Java-поток Прерывание Исключение
- 6. Java IO Исключение: Поток Closed
- 7. Как обращаться с деструктором файла, бросая исключение?
- 8. Оберните исключение в сообщении, не бросая его
- 9. Можно ли создать исключение, не бросая его?
- 10. Symfony2 не показывают ошибку 500, бросая исключение
- 11. Убивать сеанс Windows из Java-программы
- 12. исключение исключения в java 8 поток foreach
- 13. Нужна помощь, бросая монету в Java
- 14. Убивать поток с помощью сокета в нем (python)
- 15. Безопасно ли убивать поток, используя только переменные стека?
- 16. Убивать/прерывать конкретный поток, используя его ID в C#
- 17. Предотвращение строительства, бросая исключение, прежде чем конструктор тело
- 18. Конструктор заканчивает, бросая исключение? Есть ли утечка памяти?
- 19. Могу ли я создать исключение, не бросая его?
- 20. Исключение в поток «главный» - NoClassDefFoundError
- 21. Убивать java-процесс в окнах программно
- 22. Автоматически убивать процесс java с терминала
- 23. Убивать рабочий процесс Oozie из java
- 24. Бросая общий тип элемента вниз
- 25. поток уже открыт - Исключение
- 26. org.dom4j.DocumentException: поток закрыт вложенное исключение: поток закрыт
- 27. Как узнать, когда убивать темы?
- 28. Убивать сливную банку с очисткой?
- 29. В Java, бросая исключение, когда сетевое соединение теряется во время вызова WebService (аналогично WCF CommunicationException)
- 30. SingleOrDefault(), кажется, бросая System.NullReferenceException
Где вы взяли, что убийство нити является проблемой для многих людей? – Kayaman
Вы можете использовать/вызывать метод Thread.interrupt() для завершения потока. –
@RakeshSoni Нет, вы не можете (по крайней мере, не любой поток), но вы можете использовать 'Thread.stop()'. Дело в том, что вы не должны. – Kayaman