在Java中运行的VM(JBoss实例)上杀死卡住的线程?

在Java中运行的VM(JBoss实例)上杀死卡住的线程?,java,jboss,monitoring,recovery,Java,Jboss,Monitoring,Recovery,A正在我的JBoss实例的工作线程中导致无限循环。你知道一种不用重启服务器就可以杀死这个“卡住”的线程的方法吗?我们希望在部署修复程序之前能够从中恢复,最好不用重新启动 我见过一些人——如果我要编写自己的MBean,我将如何获得相关线程的句柄以中断它 更新:无法使用任何这些方法解决问题。我确实遇到了与原因有关的问题。其他人也有类似的结果。看起来更复杂的容器应该提供这种健康机制,但我猜他们的手被JVM束缚住了 您可以使用不推荐的myThread.stop()方法。但是很有可能线程仍然在那里被引用,

A正在我的JBoss实例的工作线程中导致无限循环。你知道一种不用重启服务器就可以杀死这个“卡住”的线程的方法吗?我们希望在部署修复程序之前能够从中恢复,最好不用重新启动

我见过一些人——如果我要编写自己的MBean,我将如何获得相关线程的句柄以中断它


更新:无法使用任何这些方法解决问题。我确实遇到了与原因有关的问题。其他人也有类似的结果。看起来更复杂的容器应该提供这种健康机制,但我猜他们的手被JVM束缚住了

您可以使用不推荐的myThread.stop()方法。但是很有可能线程仍然在那里被引用,因此您应该使用一些反射魔法从持有它的组件中删除对该线程的所有引用

如何找到线程?使用Thread.getThreadGroup()和ThreadGroup.getThreadGroup()转到根ThreadGroup(),然后使用iterate()函数遍历所有线程

我在第三方库中遇到了类似的bug(无限循环)。最后我自己应用了修复程序(在等待第三方库中的人修复他们的混乱时),然后我将修改后的.class放在我的.war中,确保它在伪.class之前加载(伪.class位于伪第三方.jar中)

这不太好,但很有效,请看我的问题:

我的意思是:如果你必须等待第三方被窃听的lib的负责人来修复他们的东西,你可能要等很长时间。我们负担不起。我们需要尽快修复。因此,我们最终对他们的代码进行了修补/破解

例如,您可以在无限循环中添加一个布尔检查,然后在希望伪线程“死亡”时强制循环退出


请注意,我已经十年没有使用过不推荐使用的Thread stop(),我真的不想在上述情况下使用它。

我想最困难的部分是识别挂线。您没有提供关于它的任何信息,但也许可以围绕线程的名称或其当前堆栈跟踪构建一些规则

如果您可以通过其名称识别线程,我将通过使用
thread.currentThread().getThreadGroup()
获取我自己的线程组来获取VM中的所有线程,然后通过调用线程组上的
getParent()
来遍历线程组层次结构,直到它返回
null
。现在您有了顶级线程组。现在可以使用顶级线程组上的
enumerate(Thread[]list)
方法用所有线程填充预分配数组

如果仍然需要堆栈跟踪来标识线程,还可以使用静态实用程序方法
Map thread.getAllStackTraces()
来获取所有线程。但是,计算堆栈跟踪非常昂贵,因此如果您实际上不需要它们,这可能不是最好的解决方案


识别线程后,必须对其调用
stop()
方法。中断它不会有帮助,除非运行代码的实现实际评估线程的中断标志,并按照您期望的方式运行。并不是说
stop()
方法已被弃用,而且使用它可能会产生许多有趣的副作用。您可以在API文档中找到更多详细信息。

请尝试my,它尝试执行类似的操作。

我已通过VisualVM中的线程转储识别了它。我确切地知道它是什么——不过,在代码中加入它是另一回事。您建议的获取线程组然后向上遍历的方法听起来是可行的,但我需要一个线程的实际实例句柄来对其调用stop()或interrupt()。@cwash-枚举方法返回实际的线程实例。传入的数组中填充了已找到的所有线程实例。如果您知道线程id,则可以遍历此数组,查找具有匹配id的线程。请注意,enumerate()方法具有奇怪的语义(它不会告诉您是否溢出),因此要使其全部正常工作是很困难的。注意,您可以使用ThreadGroup.getActiveCount()对数组大小进行初步猜测。@cwash-请参阅此处的一些示例:听起来可行,但我想我必须尝试一下。不知道有什么东西已经查过了吗?您是否曾经使用iterate()对线程进行排序?re:不是等待第三方开发人员来修复它,我只是说在很短的时间内(接下来的几天)等待我们的补丁通过测试。感谢他们提供了编程修复的选项,听起来不错——我真的在寻找一个内置的恢复选项。我不敢相信没有办法杀死一根你知道是恶性的线!