2014-12-03 2 views
-2

Я думаю, что убийство thread в то время, когда вы хотите, является проблемой для многих людей. Недавно я наткнулся на способ убить thread, бросив exception. Каковы ваши мысли/материалы по этому поводу? Кто-нибудь реализовал что-то подобное раньше?Убивать поток Java, бросая исключение

+1

Где вы взяли, что убийство нити является проблемой для многих людей? – Kayaman

+0

Вы можете использовать/вызывать метод Thread.interrupt() для завершения потока. –

+1

@RakeshSoni Нет, вы не можете (по крайней мере, не любой поток), но вы можете использовать 'Thread.stop()'. Дело в том, что вы не должны. – Kayaman

ответ

1

Самым лучшим способом, чтобы остановить поток, чтобы бросить InterruptedExceptionизнутри нити. Если выбрано исключение, это гарантирует, что выполняются блоки catch и finally, поэтому поток может освобождать блокировки и ресурсы, закрывать файлы и соединения, которые он открыл, и т. Д.

Часто вы хотите остановить поток от другого нить. Вы должны не использовать метод Thread.stop(), так как он немедленно останавливает поток, что приводит к взаимоблокировкам, когда закрытая нить по-прежнему принадлежит замкам, файлы, которые никогда не закрываются, и т. Д. «Официальным» способом остановить поток является вызов interrupt() метод в потоке, который вы хотите остановить. Это устанавливает внутренний флаг, который может быть проверен на Thread.interrupted(). Каждый поток должен теперь опрашивает Thread.interrupted() в удобное время и бросить InterruptedException если флаг установлен:

if (Thread.interrupted()) throw new InterruptedException(); 
+0

Из комментариев вы должны были понять, что проблема OP заключается именно в том, что у него нет гарантии, что поток, который будет остановлен, когда-либо достигнет точки «удобного времени». –

+0

@ErwinSmout. В самом деле? Я вижу один комментарий от OP, который 1) был добавлен, когда я печатал свой ответ, поэтому я не читал его раньше, и 2), похоже, не говорит, что вы утверждаете, он говорит, только он хочет, чтобы поток остановить «в определенное время». Дело в том, что вы не можете * безопасно * остановить поток в точное время, потому что вам нужно дать время потока для очистки, и любой хороший ответ должен указать на это. – Hoopje

1

Вы не должны убивать нить. Вы должны остановить его. Если у вас есть цикл, вы должны остановить этот цикл. Если у вас есть некоторая трудоемкая функция, например, подключение к сети, вы должны остановить эту сетевую функцию, а не убивать поток. Там нет никакой гарантии, чтобы остановить поток с Thread.stop() функцией

+1

Oh 'Thread.stop()' остановит поток просто отлично (если менеджер безопасности не предотвратит его). Это просто не очень мило. – Kayaman

+0

Возможно. но сама функция устарела. это означает, что вы не должны его использовать. Даже функция может быть удалена из jre в какой-то момент. http://10kloc.wordpress.com/2013/03/03/java-multithreading-steeplechase-stopping-threads/ – Adem

+0

Точно, вы не должны использовать его, потому что у него есть проблемы. Однако маловероятно, что он будет удален (хотя теоретически это может быть). Это принесет больше вреда, чем пользы. – Kayaman

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