java - 可靠地停止无响应的线程

标签 java multithreading denial-of-service

我想知道如何在 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() 也是如此。 (总是正确的)。

最佳答案

这可能是不可能的,至少在每种情况下都不可靠。
如果我正确理解了该机制(并且存在一些不确定性),如果代码的执行方式在执行期间没有安全点(例如在计数循环中),则 JVM 不可能向它应该停止的线程(线程从不轮询中断)。
在这种情况下,您需要杀死 JVM 进程,而不是线程。
一些额外的阅读:
How to get Java stacks when JVM can't reach a safepoint
Counted loops

关于java - 可靠地停止无响应的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65503490/

相关文章:

java - 不关闭 stringwriter 会导致泄漏吗?

java - 如何在 Spring 中定义多个 sessionfactory 实例?

java - "main"org.apache.spark.SparkException : Task not serializable

windows - Windows Azure 是否有任何可用的方法来抵御拒绝服务攻击?

Java SAX 解析器,如何完全防止字符引用? (DoS 攻击)

java - MongoDB 和 Java 驱动程序 : Range Query

java - 为什么 Sorted JLists 还没有成为标准 Swing 库的一部分?

c++ - 如何退出后台线程循环?

multithreading - "Spawn a thread"类似 node.js 中的行为

使用 WebWorker 的 JavaScript DoS 攻击