Java提供注冊鈎子線程,在JVM進程關閉之前,會自動執行這個鈎子線程。
運用這個技巧,可以再JVM關閉之前,釋放一些系統資源。
這個功能利用的是Runtime類來實現。
public class Hook { public static void main(String args[]){ System.out.println("程序開始執行"); try{ Thread.sleep(100); } catch(Exception ex){ } Runtime.getRuntime().addShutdownHook(new Thread(){ @Override public void run() { System.out.println("執行鈎子函數 -- " + 1); } }); Runtime.getRuntime().addShutdownHook(new Thread(){ @Override public void run() { System.out.println("執行鈎子函數 -- " + 2); } }); Runtime.getRuntime().addShutdownHook(new Thread(){ @Override public void run() { System.out.println("執行鈎子函數 -- " + 3); } }); Runtime.getRuntime().addShutdownHook(new Thread(){ @Override public void run() { System.out.println("執行鈎子函數 -- " + 4); } }); System.out.println("程序執行完畢,退出main"); } }
輸出
可以看到,執行順序和注冊順序是不一致的。一般也不會 注冊多個鈎子函數。
程序開始執行 程序執行完畢,退出main 執行鈎子函數 -- 2 執行鈎子函數 -- 3 執行鈎子函數 -- 4 執行鈎子函數 -- 1
同時,還提供了移除鈎子函數的功能
public boolean removeShutdownHook(Thread hook)