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