2009-12-03 1 views
6

Я использую пул потоков для своей задачи. После завершения каждой задачи я уничтожаю нить, используя Thread.stop() и Thread.destroy(). Но после запуска моего приложения (в Eclipse) около 30 минут. Я получаю ошибку памяти из связанной ошибки.Как уничтожить поток в java после завершения задачи

Пожалуйста, предложите мне, как убить нить.

ответ

13

Если вы используете пул потоков, вы не должны прерывать поток, чтобы начать с него - вся точка пула потоков заключается в повторном использовании потоков.

Если вы не хотите для повторного использования нити, тогда просто начните новую нить вместо использования пула потоков - и просто позвольте нити умереть, а не вызвать стоп или уничтожить. Эти методы устарели по уважительной причине - их в принципе не следует называть.

Не совсем ясно, как это могло бы вызвать исключение из памяти, хотя есть ли причина, по которой вы фокусируетесь на потоке в качестве вероятной причины?

4

Когда задача завершена, поток должен вернуться. Больше ничего не делайте. Это позаботится о вещах.

5

Чтобы усилить то, что сказал @Jon Skeet, это ДЕЙСТВИТЕЛЬНО ПЛОХАЯ ИДЕЯ, чтобы назвать устаревшие методы Thread.stop() или Thread.destroy().

Согласно javadoc, Thread.destroy() был принципиально опасным и никогда не был реализован. Первоначальная идея состояла в том, чтобы просто убить поток и сломать все его блокировки монитора. Если бы это было в середине обновления общей структуры данных, структура данных осталась бы в неопределенном состоянии. Другие потоки, ожидающие, что убитый поток уведомит какой-то объект, будут ждать навсегда.

Thread.stop() вызывает исключение ThreadDeath при неожиданном (к пораженному коду) месте. Это немного более упорядоченно, чем убийство потока, но если все остановленные потоки (включая все, что он вызывает), тщательно написаны с блоками finally, чтобы уведомить официантов, восстановить структуры данных и т. Д., У вас есть та же проблема.

Обратитесь к Java Thread Primitive Deprecation за всю историю.

+0

Да, очень опасно. Я часто шутил, что единственный безопасный способ убить поток - это System.exit(). – PSpeed

0

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

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