java - java中杀死一个对象

标签 java jmx destroy

我目前正在使用 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/

相关文章:

java - 值在提交时发生变化。 |可调用语句

java - 向 JAXB 元素添加属性

java - 如何使用卡片布局中的按钮导航到上一张卡片?

c# - stackPanel1.Children.RemoveAt 是否会销毁(处置)控件?

migration - 删除了migration.rb文件? Rails 中的潜在错误?

java - 如何让 Selenium 等待页面加载然后检查 URL?

java - JMX:从服务器读取属性

java - Java Mission Control 的 MBean 浏览器中的颜色是什么?

java - 是否可以通过 JMX 管理 C++ 应用程序?

javascript - jQuery 在自定义插件上实现销毁方法