初學者如何在學Java過程中處理異常中止的線程!
在 單線程的開發過程中,通常採用 try-catch的方式進行異常捕獲,但是這種方式在 多線程環境中會顯得 無能為力,而且還有可能導致一些問題的出現,比如發生異常的時候 不能及時回收系統資源,或者 無法及時關閉當前的連接...
概述
Java中有兩種異常,即 已知異常(編輯器會提示捕獲或者拋出)和 未知異常(特殊情況下發生),由於線程中的 run()方法是不接受拋出語句的(只能內部捕獲),所以在面對 未知異常的情況,線程默認的會將堆棧跟蹤信息輸出到控制台中(或者記錄到錯誤日誌文件中)然後退出程序。
在JDK1.5之前,不能為線程單獨設置或指定一個默認的 UncaughtExceptionHandler,為了設置 UncaughtExceptionHandler,需要繼承 ThreadGroup並覆寫 uncaughtException方法。 幸運的是 JDK1.5后線程提供了一個 setUncaughtExceptionHandler方法,用來捕獲並處理因線程中拋出的 未知異常,以避免程序終止。
Advertisements
案例
1,首先模擬一個連接池,提供
2,為了測試需要,只是簡單模擬了一個異常
分析: 從日誌中,並未發現關閉資源應有的日誌輸出,很明顯 try-catch沒有起作用,因為在 main函數中他是 主線程,當 thread.start()之後, 主線程的代碼與 子線程就沒半毛錢關係了,所以發生在 子線程內部的錯誤無法捕獲到。
解決方案
使用 UncaughtExceptionHandler,這裡為了偷懶使用了 lambda簡化了匿名內部類的寫法(也可以實現 UncaughtExceptionHandler)
分析: 從日誌中可以發現錯誤信息被我們捕獲了,並且可以成功釋放資源!使用 UncaughtExceptionHandler,可以捕獲到 未知異常且記錄下自定義的日誌(默認拋出堆棧信息)
Advertisements
Java程序員學習交流群515675832,既有技術大佬,又有老司機開車,各位對Java感興趣的可以來交流學習一下,快樂與技術一起進步