我目前正在使用 JMX 来管理和监视在 Java 类中执行的巨大迁移过程。
我希望能够在需要时中止并终止该进程,例如所需的客户/时间,或者在一次迁移中发生一些死循环。
在这里,我们通过设置一个 boolean 标志来调用 abort ,这是一种优雅地终止线程的方法,并且每次循环都会首先检查该标志,然后决定是否继续。这已经实现,没有任何问题。
但是,我在终止线程时遇到了麻烦。我的同事建议我重写 Finalize() 方法并尝试在其中杀死它。不过网上查到这个方法并不能销毁对象,建议由GC调用,而由用户调用。
我想这个理论是可以的,只要对象被销毁,就不会再发生任何进程。我只是不确定这是否能够在JAVA中实现。
另外,我想知道你们还有什么其他方法可以给我提示吗?
非常感谢您的帮助。
P.S:与 JMX 相关,并不意味着它真的与 JMX 有关,只是我希望这个终止命令来自 JMX 控制台客户端。
最佳答案
有点难以理解你在说什么,但我不认为finalize
会有任何帮助。
根据定义, Activity 线程(即已启动但尚未终止的线程)是可访问的,因此不会被垃圾收集。所以添加finalize方法不会有任何影响。
如果您正在谈论的对象不是线程,那么添加终结可能也无济于事:
- 如果线程的可运行(或其他)具有对该对象的引用,这将阻止它被垃圾收集。
- 如果没有,并且该对象确实变得无法访问,则
finalize
在 GC 决定收集对象之前,该方法不会运行...而这可能永远不会发生。 - 即使
finalize
方法确实被调用了,它能做什么?您已经告诉线程关闭...但什么也没有发生。
这里真正的问题似乎是线程没有响应您的“正常关闭”标志。
我尝试使用
Thread.interrupt()
来解决此问题和Thread.isInterrupted()
而不是自定义标志。这样做的优点是中断也可以解锁类似Thread.sleep
的内容。Object.wait
以及某些 I/O 操作。如果线程在尝试通过套接字或管道与某些外部服务通信时被阻止,您可以通过关闭套接字和/或流来解除阻止。当然,这是假设您的关闭代码可以获取对 Socket 或 Stream 对象的引用。
如果这些方法失败,我会考虑通过调用
System.exit()
来终止整个应用程序。 ...如果这是合理的做法。如果您完全绝望(并且有点疯狂),您可以考虑使用已弃用的
Thread.abort()
方法。但是,这很可能会使您的整个应用程序处于损坏且无响应的状态。所以我不推荐这种方法。
需要考虑的其他可能性是:
- 线程实际上已响应并退出,但您的关闭代码没有注意到,
- 线程在您尝试关闭它之前就已死亡,并且您的关闭代码没有注意到,
- 线程陷入死锁,或者
- 需要修改可运行对象中存在一些长时间运行(但不是无限)的循环,以更频繁地检查“you die now”标志。
其中一些事情可以通过附加调试器并进行线程转储来诊断。
<小时/>我想你说过你看到了这样的建议:调用 System.gc()
是一个坏主意。 。这是个好建议。
关于java - java中杀死一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5482334/