一赡矢、捕獲線程執(zhí)行異常
Java為我們提供了一個 UncaughtExceptionHandler
接口肋演,當(dāng)線程在運(yùn)行過程中出現(xiàn)異常時,會回調(diào) UncaughtExceptionHandler
接口死宣,從而得知是哪個線程在運(yùn)行時出錯伟恶,以及出現(xiàn)了什么樣的錯誤。
// 設(shè)置回調(diào)接口
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
}
});
當(dāng)進(jìn)程被啟動的時候毅该,執(zhí)行Thread的 setDefaultUncaughtExceptionHandler
方法來監(jiān)聽進(jìn)程內(nèi)的異常博秫。
當(dāng)然,如果已經(jīng)被 try { } catch (Exception e) { }
捕獲的異常將不會被 uncaughtExceptionHandler
重復(fù)捕獲眶掌。
二挡育、Hook線程(注入鉤子線程)
JVM進(jìn)程的退出是由于JVM進(jìn)程中沒有活躍的非守護(hù)線程,或者收到了系統(tǒng)中斷信號朴爬,向JVM程序注入一個Hook線程即寒,在JVM進(jìn)程退出的時候,Hook線程會啟動執(zhí)行召噩,通過 Runtime 可以為 JVM 注入多個 Hook 線程母赵。
// 注入一個 Hook 線程
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
}
}));
當(dāng)程序退出時,會執(zhí)行到該 Hook 線程具滴。
Hook 線程可以注入多個凹嘲,當(dāng)程序主動退出或異常退出時,可以利用 Hook 線程做一些釋放資源的操作构韵。
Hook 線程不要處理耗時操作周蹭,否則會延長程序退出的時間。
[本章完...]