Java關閉掛鉤(shutdown hook)

當JVM正常或突然關閉時,關閉掛鉤可用於執行清理資源或保存狀態。 執行乾淨資源意味着關閉日誌文件,發送一些警報或其他內容。 因此,如果要在JVM關閉之前執行某些代碼,請使用關閉掛鉤(shutdown hook)。

JVM什麼時候關閉?
JVM在以下情況下關閉:

  • 用戶在命令提示符下按ctrl + c
  • 調用System.exit(int)方法
  • 用戶註銷計算機。
  • 用戶關閉計算機等

addShutdownHook(Thread hook)方法
Runtime類的addShutdownHook()方法用於向虛擬機註冊線程。

語法如下:

public void addShutdownHook(Thread hook){}

可以通過調用靜態工廠方法getRuntime()來獲取Runtime類的對象。 例如:

Runtime r = Runtime.getRuntime();

工廠方法
返回類實例的方法稱爲工廠方法。

Shutdown Hook的簡單示例

package com.yiibai;

class MyThread extends Thread{
    public void run(){
        System.out.println("shut down hook task completed..");
    }
}

public class TestShutdown1{
    public static void main(String[] args)throws Exception {

        Runtime r=Runtime.getRuntime();
        r.addShutdownHook(new MyThread());

        System.out.println("Now main sleeping... press ctrl+c to exit");
        try{Thread.sleep(3000);}catch (Exception e) {}
    }
}

執行上面示例代碼,得到以下結果:

Now main sleeping... press ctrl+c to exit
shut down hook task completed..

Process finished with exit code 0

注意: 可以通過調用Runtime類的halt(int)方法來停止關閉序列。

使用匿名類的Shutdown Hook示例:

package com.yiibai;

public class TestShutdown2{
    public static void main(String[] args)throws Exception {

        Runtime r=Runtime.getRuntime();

        r.addShutdownHook(new Thread(){
                              public void run(){
                                  System.out.println("shut down hook task completed..");
                              }
                          }
        );

        System.out.println("Now main sleeping... press ctrl+c to exit");
        try{Thread.sleep(3000);}catch (Exception e) {}
    }
}

執行上面示例代碼,得到以下結果:

Now main sleeping... press ctrl+c to exit
shut down hook task completed..

Process finished with exit code 0