关闭应用程序时调用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()的用法