初學者如何在學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感興趣的可以來交流學習一下,快樂與技術一起進步

Advertisements

你可能會喜歡