概要
由於線程的本質特性,不能捕獲從線程中逃逸的異常,一旦異常從run()方法拋出,它就會從控制檯打印出來,除非採取特殊的步驟來捕獲這種錯誤的異常。這篇文章就來了解一下併發中異常的捕獲處理。
問題描述
首先看以下代碼,在run()方法中拋出一個異常,很明顯沒有經過任何處理的話,會在控制檯輸出異常信息。
如果在main方法中假如try-catch塊是沒有作用的,與上面的代碼一樣在控制檯拋出異常:
問題解決
爲了解決上述問題,我們需要修改Executor產生線程的方式。使用Thread.UncaughtExceptionHandler接口,它允許在每個線程對象上附着一個異常處理器,會在線程因未捕獲異常導致將要死亡時被調用。
HandlerThreadFactory類實現了ThreadFacotry接口,把實例化的對象作爲參數傳給Executors.newCachedThreadPool()方法,之後使用返回的ExecutorService創建的線程都會具有相同的線程配置。在這裏我們通過setUncaughtExceptionHandler()方法設置了異常捕獲處理器。
上面的代碼中是按照具體情況設置的處理器,如果已知在代碼中每個地方都使用相同的異常處理器,可以設置默認的異常處理器。這個處理器只有在不存在線程專有異常處理器的情況下才會被調用。