當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();
工廠方法
返回類範例的方法稱為工廠方法。
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)
方法來停止關閉序列。
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