簡體   English   中英

關閉應用程序時,Java Finalize方法調用

[英]Java Finalize method call when close the application

我對finalize方法有疑問。 如果我有許多具有很多繼承的類,那么在應用程序關閉時如何調用所有finalize方法?

System.runFinalizersOnExit(true) ,但請注意,它已被棄用。 如果您依靠這種事情,那么您基本上已經在做錯事了。

finalize()方法不會在應用程序退出時運行。

推薦的方法是使用關閉鈎子。

例如

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        // shutdown logic
    }
});

在以下情況下執行關閉掛鈎:

  • 程序正常退出,例如System.exit
  • 用戶中斷,例如鍵入^ C,注銷或系統關閉

Java還提供了@deprecated的方法runFinalizersOnExit() 不推薦使用它的原因如下:

這可能會導致在活動對象上調用終結器,而其他線程正在同時操縱這些對象,從而導致行為不穩定或死鎖

本質上, runFinalizersOnExit()是不安全的。 如上所述,請使用關閉鈎子。

如果您需要清理事物,關閉日志文件,發送警報或在Java虛擬機關閉時采取其他措施,特別是有人按下CTRL + C並關閉VM或發送kill信號時,在Unix / Linux中,則必須查看ShutdownHook

關閉鈎子只是一個已初始化但未啟動的線程。 當虛擬機開始其關閉序列時,它將以未指定的順序啟動所有已注冊的關閉掛鈎,並使其同時運行。 當所有掛鈎完成后,如果啟用了退出時終結,則它將運行所有未調用的終結器。 最后,虛擬機將停止。 請注意,如果關閉是通過調用exit方法啟動的,則守護程序線程將在關閉序列期間繼續運行,非守護程序線程也將繼續運行。

最好不要依靠finalize()來清理JVM中的資源。

來自Javadoc

當垃圾回收確定不再有對該對象的引用時,由垃圾回收器在對象上調用。 子類覆蓋finalize方法以處置系統資源或執行其他清除。

編輯:請參閱此博客有關finalize()的用法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM