我想知道如何在java中停止一个没有响应的线程,这样它就真的死了。
首先,我很清楚 Thread.stop()
被否决以及为什么不应该使用它;关于这个问题,已经有很多很好的答案了,参见[1][2]。所以,更确切地说,问题是,从技术上讲,是否有可能杀死一个线程,这个线程的代码不受我们控制,但可能是敌对的,并且不响应中断。
在最简单的情况下,恶意线程将运行 while(true);
,但它也可能会耗尽内存或其他系统资源,造成更大的破坏。打电话 interrupt()
在那条线上显然是无效的。打电话怎么样 stop()
相反呢?
我已经在一个调试器中运行了这个,事实上,线程真的消失了。但这种方法可靠吗?敌对的线索可以为这个案子做好准备;想想 try{run();}catch(ThreadDeath t){run();}
在那里它抓住了 ThreadDeath
那是我们打电话时产生的 stop()
然后递归地再次调用自己。
作为一个旁观者,我们看不到发生了什么; Thread.stop()
总是默默地奔跑。最糟糕的是,通常的诊断不再起作用(在corretto 1.8.0\u 275 windows x64上调试时尝试了此方法): Thread.getState()
总是回来 RUNNABLE
不管成功地终止线程,同样的情况也会发生 Thread.isAlive()
(始终正确)。
1条答案
按热度按时间0dxa2lsx1#
这可能是不可能的,至少在每种情况下都不可靠。
如果我正确理解了该机制(其中存在一些不确定性),如果代码以这样的方式执行,在执行过程中没有安全点(例如在计数的循环中),jvm就不可能向线程发出它应该停止的信号(线程从不轮询中断)。
在这种情况下,您需要终止jvm进程,而不是线程。
一些额外的阅读:
当jvm无法达到安全点时,如何获得java堆栈
计数的循环