java.lang.Runtime.addShutdownHook(Thread hook) 方法註冊一個新的虛擬機器關閉掛鉤。 Java虛擬機器的關閉響應於兩種事件:
該程式正常退出,當最後一個非守護執行緒退出或退出(等同於System.exit)方法被呼叫時,或
關閉勾點是一個簡單的初始化但尚未啟動的執行緒。
當虛擬機器開始其關閉序列將啟動所有已註冊的關閉勾點在一些未指定的順序,讓他們同時執行。當所有的勾點都做完了會然後執行所有未呼叫的終結,如果最後確定的按出口已啟用。最後,虛擬機器將暫停。需要注意的是守護執行緒將繼續關閉序列期間執行,將作為非守護執行緒,如果關機是通過呼叫exit方法啟動。
以下是java.lang.Runtime.addShutdownHook()方法的宣告
public void addShutdownHook(Thread hook)
這個方法沒有返回值。
下面的例子顯示lang.Runtime.addShutdownHook()方法的使用。
package com.yiibai; public class RuntimeDemo { // a class that extends thread that is to be called when program is exiting static class Message extends Thread { public void run() { System.out.println("Bye."); } } public static void main(String[] args) { try { // register Message as shutdown hook Runtime.getRuntime().addShutdownHook(new Message()); // print the state of the program System.out.println("Program is starting..."); // cause thread to sleep for 3 seconds System.out.println("Waiting for 3 seconds..."); Thread.sleep(3000); // print that the program is closing System.out.println("Program is closing..."); } catch (Exception e) { e.printStackTrace(); } } }
讓我們編譯並執行上述程式,這將產生以下結果:
Program is starting... Waiting for 3 seconds... Program is closing... Bye.
虛擬機器終止響應使用者中斷,如打字^ C或系統範圍的事件,比如使用者登出或關閉系統。
hook -- 已初始化但尚未啟動的執行緒物件
IllegalArgumentException -- 如果指定的鉤已被註冊,或如果它可以被判定為鉤已經執行或已經執行
IllegalStateException -- 如果虛擬機器已處於關閉的過程中
SecurityException -- 如果安全管理器存在並且它拒絕RuntimePermission(“shutdownHooks”)