关闭应用程序时调用Java Finalize方法

Haz*_*zim 3 java finalizer

我对finalize方法有疑问.如果我有很多具有许多继承的类,那么当应用程序关闭时如何调用所有finalize方法?

use*_*421 12

System.runFinalizersOnExit(true),但请注意,它已被弃用.如果你依赖这种事情,你基本上已经做错了.

  • 它被弃用的原因是它不安全! (4认同)
  • @PeterLawrey No.如果你打电话给它*是*保证.这就是它的用途.由于Javadoc中给出的原因,它是不安全的. (2认同)

cmd*_*cmd 6

finalize() 方法不在应用程序退出时运行.

建议的方法是使用关闭钩子.

例如

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        // shutdown logic
    }
});
Run Code Online (Sandbox Code Playgroud)

在以下情况下执行关闭挂钩:

  • 程序正常退出,例如System.exit
  • 用户中断,例如键入^ C,注销或系统关闭

Java也提供了一个调用的方法,runFinalizersOnExit()这是@deprecated.它因以下原因而被弃用:

它可能导致在活动对象上调用终结器,而其他线程同时操作这些对象,导致不稳定的行为或死锁

基本上,runFinalizersOnExit()是不安全的.如上所述,使用关闭钩子.