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