我对finalize方法有疑问。如果我有许多具有许多继承的类,那么当应用程序关闭时如何调用所有finalize方法?
答案 0 :(得分:11)
System.runFinalizersOnExit(true)
,但请注意,它已被弃用。如果你依赖这类事情,你基本上已经做错了。
答案 1 :(得分:6)
finalize()
方法不会在应用程序退出时运行。
推荐的方法是使用关闭钩子。
e.g。
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
// shutdown logic
}
});
在以下情况下执行关闭挂钩:
Java还提供了一个名为runFinalizersOnExit()
的方法@deprecated
。它因以下原因而被弃用:
可能会导致在活动对象上调用终结器 而其他线程同时操纵这些对象, 导致不稳定的行为或死锁
基本上,runFinalizersOnExit()
是不安全的。如上所述,使用关闭钩子。
答案 2 :(得分:1)
如果您需要清理内容,关闭日志文件,发送警报或在Java虚拟机关闭时执行其他操作,尤其是有人按下CTRL + C并关闭VM或发送Unix / Linux中的kill信号,你必须看ShutdownHook。
关闭钩子只是一个初始化但未启动的线程。当虚拟机开始其关闭序列时,它将以某种未指定的顺序启动所有已注册的关闭挂钩,并让它们同时运行。当所有挂钩都完成后,如果启用了finalization-on-exit,它将运行所有未读取的终结器。最后,虚拟机将停止。请注意,守护程序线程将在关闭序列期间继续运行,如果通过调用exit方法启动关闭,则非守护程序线程将继续运行。
答案 3 :(得分:-1)
最好依靠finalize()来清理JVM中的资源。
来自Javadoc。
垃圾收集时由垃圾收集器调用对象 确定没有对该对象的更多引用。一个子类 覆盖最终化方法来处理系统资源或 进行其他清理。
修改:请参阅此博客,了解finalize()用法