2009-07-09 2 views
2

Можно ли убить поток Java, не создавая в нем исключения?Убивать поток мгновенно в Java

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

Примечание. Я видел устаревший метод Thread.destroy(), но в документации говорится, что он никогда не был реализован в первую очередь.

+0

В окнах используйте Process Explorer, чтобы убить поток внутри процесса. – akarnokd

ответ

6

Нет. Существует устаревший метод «неотъемлемо небезопасный» Thread.stop(), но, как подчеркивает его комментарий, все может быть оставлено в сильно поврежденном состоянии, а ThreadDeath Error по-прежнему бросается внутри потока.

объяснение Солнца проблем с stop(), которые могут проявляться долго после того, как он, кажется, работает, находится по адресу:

http://java.sun.com/j2se/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

Не будет убивать процесс виртуальной машины Java (или дергать вилку) быть лучше моделирование компьютерной смерти?

+1

Не, если я хочу сделать это из теста интеграции. – ripper234

+0

Ну, если вы используете 'stop()', это может испортить процесс/кучу, поэтому последующие тесты не являются чистыми и независимыми. У вас может быть интеграционный тест вне JVM, который убивает и перезапускает процесс Java. Если у вас многопоточный IO, вы можете отключить внешний процесс или выполнить другую гадость. Я думаю, что это может быть ближе всего к воспроизводимому моделированию смерти системы. – gojomo

+1

Так что, если это сделано в тесте интеграции? Просто запустите новый JVM для этого теста! (В чем проблема?) – Arafangion

0

В чем смысл вашего теста? Java не дает никаких гарантий относительно того, что происходит на выходе, кроме попыток запуска затворов при отключении, если выход является «чистым».

Это похоже на попытку протестировать поведение вашей программы в случае, если оно идет OutOfMemory; вы ничего не можете с этим поделать и не можете сказать детерминистически, что произойдет

+0

Дело в том, чтобы проверить обработку транзакций.Если компьютер умирает в середине потока, транзакция откатется, а другой компьютер (= служба) должен в конечном итоге получить задания в транзакции. – ripper234

+0

Вы написали слой транзакции? Или вы используете чужой –

+0

Это звучит так, как будто его нужно протестировать в тесте «интеграции», а не в модульном тесте. т. е. вы действительно выходите из программы в точке транзакции. –

0

Есть ли причина, по которой вы не можете использовать Thread.suspend()? Он остановит поток, чтобы вы могли проверить состояние, когда поток прерывается.

Вы также можете использовать Thread.stop(), хотя это рискует выбросить несколько ThreadDeathExceptions. Вы можете обернуть его int try/catch/finally, но никаких гарантий нет.

0

Резьба нити() вызывает ошибку в потоке. ThreadDeath

Единственный способ имитировать приложение, умирающее в середине потока, - вызвать System.exit().

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

2

Нет портативного метода. Вы можете попытаться вызвать «kill -9» (или ваш локальный эквивалент) на весь процесс java, если вы хотите подавить запуск финализаторов и завершающих крючков.

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

1

Или вы можете ... убить процесс. (то есть, если это Linux, отправьте сигнал kill -9 в процесс).

Остерегайтесь проблем с расы, если вы пытаетесь что-то проверить - если вы надеетесь сильно пострадать - это может произойти только раз в месяц, если вам особенно не повезло.

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