Мне интересно, как остановить не отвечающий поток в Java, чтобы он действительно умер.
Прежде всего, я хорошо знаю, что Thread.stop()
устарел и почему его не следует использовать; на эту тему уже есть много отличных ответов, ср. [1][2]. Итак, вопрос точнее в том, возможно ли технически убить поток, код которого не контролируется нами, но, возможно, является враждебным и не отвечает на прерывания.
В простейшем случае враждебный поток будет работать while(true);
, но он также может использовать память или другие системные ресурсы, чтобы причинить больше вреда. Вызов interrupt()
в этом потоке явно неэффективен. Как насчет того, чтобы вместо этого позвонить stop()
?
Я запустил это в отладчике, и на самом деле поток действительно исчезает. Но надежен ли этот подход? На этот случай можно было бы подготовить враждебную нить; подумайте о try{run();}catch(ThreadDeath t){run();}
, где он ловит ThreadDeath
, который создается, когда мы вызываем stop()
, и снова рекурсивно вызывает сам себя.
Как сторонний наблюдатель мы не можем видеть, что происходит; Thread.stop()
всегда работает бесшумно. Хуже всего то, что обычная диагностика больше не работает (пробовал это при отладке на Corretto 1.8.0_275 Windows x64): Thread.getState()
всегда возвращает RUNNABLE
независимо от успеха в уничтожении потока, то же самое касается Thread.isAlive()
(всегда верно).
isAlive()
всегда возвращает true, если поток не завершился нормально (сам по себе или по прерыванию), как написано выше. Таким образом, этот цикл будет просто зацикливаться навсегда. - person pxcv7r   schedule 31.01.2021