【问题标题】:Java, how to kill process on object destroyJava,如何在对象销毁时终止进程
【发布时间】:2012-04-11 22:41:04
【问题描述】:

假设我有一个对象“A”,它在其构造函数中启动某个进程。一旦对象被释放(设置为 null 或超出其生命范围),我需要调用清理方法。

问题在于 java 没有析构函数,并且不能保证在对象设置为 null 或超出范围后立即运行所谓的“finalize”方法。只有当 GC 认为“时机已到”时。

我也不能使用关闭钩子,因为我的代码在 Java EE 服务器上运行,并且不是一个简单的 Java SE 应用程序,它会立即运行和终止。遇到这种情况怎么办?

【问题讨论】:

  • 如果您举例说明您正在努力实现的目标,那么我们或许可以帮助您为您的问题提出解决方案或不同的方法。

标签: jakarta-ee garbage-collection destructor jboss7.x


【解决方案1】:

您不应该在 Java EE 容器中创建自己的线程,也不要试图杀死它们,因为这已被弃用,并且会破坏您的虚拟机/Java EE 容器。

查看允许在 Java EE 容器中创建后台工作程序的 CommonJ JSR 237:http://docs.oracle.com/cd/E13222_01/wls/docs92/commonj/commonj.html

您可以使用 ServletContextListener 控制 Java EE 应用程序的启动和关闭:http://www.roseindia.net/servlets/ServletContextListener-example.shtml

【讨论】:

    【解决方案2】:

    使用 Java 是不可能的。

    每当 GC 想要删除对象时调用 finalize,但在程序终止时不会调用(这在 Java EE 应用程序中不应该发生)。

    所以唯一的办法就是自己动手。例如,您可以使用 ObjectPool,其中对象 A 的所有实例都存储在一个列表中(如果需要,还带有额外的时间戳)。当时间到时(例如由使用 wget 和 cron 的特殊 URL 触发),您只需遍历此列表并销毁不再需要的每个对象。

    这只是一种(非常简单)可能的方法。

    【讨论】:

      猜你喜欢
      • 2015-03-23
      • 2018-11-19
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多