JDK提供了Java.Runtime.addShutdownHook(Thread hook)方法,可以注冊(cè)一個(gè)JVM關(guān)閉的鉤子与学,這個(gè)鉤子可以在一下幾種場(chǎng)景中被調(diào)用:
- 程序正常退出
- 使用System.exit()
- 終端使用Ctrl+C觸發(fā)的中斷
- 系統(tǒng)關(guān)閉
- OutOfMemory宕機(jī)
- 使用Kill pid命令干掉進(jìn)程(注:在使用kill -9 pid時(shí)谱煤,是不會(huì)被調(diào)用的)
這個(gè)方法的意思就是在jvm中增加一個(gè)關(guān)閉的鉤子摊求,當(dāng)jvm關(guān)閉的時(shí)候,會(huì)執(zhí)行系統(tǒng)中已經(jīng)設(shè)置的所有通過(guò)方法addShutdownHook添加的鉤子刘离,當(dāng)系統(tǒng)執(zhí)行完這些鉤子后室叉,jvm才會(huì)關(guān)閉。所以這些鉤子可以在jvm關(guān)閉的時(shí)候進(jìn)行內(nèi)存清理硫惕、對(duì)象銷毀茧痕、關(guān)閉連接等操作。
public static void main(String[] args) {
//Shutdown hook demo
Thread thread1 = new Thread() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (Exception ex) {
ex.printStackTrace();
}
System.out.println("thread1...");
}
};
System.out.println("main開始");
try {
thread1.start();
thread1.join();
} catch (Exception ex) {
ex.printStackTrace();
}
System.out.println("main即將結(jié)束");
//定義shutdownhook
Thread shutdownThread = new Thread() {
@Override
public void run() {
System.out.println("Shutdown hook");
}
};
Runtime.getRuntime().addShutdownHook(shutdownThread); //注冊(cè)鉤子
System.out.println("main結(jié)束");
}
輸出結(jié)果
main開始
thread1...
main即將結(jié)束
main結(jié)束
Shutdown hook