假设我有一个对象“A”,它在构造函数中启动一些进程。一旦释放了对象(设置为null或超出其生命范围),我需要调用清理方法。
问题是java没有析构函数,并且在对象设置为null或超出范围之后,不能保证所谓的“finalize”方法正好运行。只有当GC认为“时机已到”时。
此外,我无法使用关闭挂钩,因为我的代码在Java EE服务器上运行,并且不是一个可以立即运行和终止的简单Java SE应用程序。在这种情况下可以做些什么?
答案 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想要删除对象时都会调用所以唯一的方法就是自己做。例如,您可以使用ObjectPool,其中对象A的所有实例都存储在列表中(如果需要,还有一个额外的时间戳)。当时间到了(例如,使用wget& cron通过特殊URL触发)时,您只需遍历此列表并销毁不再需要的每个对象。
这只是一种(非常简单)可能的方式。