Java,如何杀死对象上的进程破坏

时间:2012-03-28 10:41:45

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

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

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

此外,我无法使用关闭挂钩,因为我的代码在Java EE服务器上运行,并且不是一个可以立即运行和终止的简单Java SE应用程序。在这种情况下可以做些什么?

2 个答案:

答案 0 :(得分:2)

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

看一下CommonJ JSR 237,它允许在Java EE容器中创建后台工作器:http://docs.oracle.com/cd/E13222_01/wls/docs92/commonj/commonj.html

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

答案 1 :(得分:1)

使用Java是不可能的。

每当GC想要删除对象时都会调用,而不是在程序终止时调用(在Java EE应用程序中不应该发生这种情况)。

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

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