我想知道如何停止 Java 中无响应的线程,使其真正死亡。
首先,我很清楚Thread.stop()
已被弃用以及为什么不应使用它;关于这个主题已经有很多出色的答案,参见。[1] https://stackoverflow.com/questions/10645216/killing-an-unresponsive-thread-in-android-java[2] https://stackoverflow.com/questions/10961714/how-to-properly-stop-the-thread-in-java。因此,更准确的问题是,从技术上来说,是否真的有可能杀死一个代码不受我们控制但可能具有敌意且不响应中断的线程。
在最简单的情况下,一个敌对线程正在运行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()
(始终正确)。
这可能是不可能的,至少在每种情况下都不可靠。
如果我正确理解了该机制(并且存在一些不确定性),如果代码以在执行期间没有安全点的方式执行(例如在计数循环中),则 JVM 不可能向它应该停止的线程(该线程从不轮询中断)。
在这种情况下,您需要杀死 JVM 进程,而不是线程。
一些额外阅读:
当 JVM 无法到达安全点时如何获取 Java 堆栈 https://stackoverflow.com/questions/20134769/how-to-get-java-stacks-when-jvm-cant-reach-a-safepoint
计数循环 http://psy-lob-saw.blogspot.com/2016/02/wait-for-it-counteduncounted-loops.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)