併發之捕獲異常

概要

由於線程的本質特性,不能捕獲從線程中逃逸的異常,一旦異常從run()方法拋出,它就會從控制檯打印出來,除非採取特殊的步驟來捕獲這種錯誤的異常。這篇文章就來了解一下併發中異常的捕獲處理。

問題描述

首先看以下代碼,在run()方法中拋出一個異常,很明顯沒有經過任何處理的話,會在控制檯輸出異常信息。

 如果在main方法中假如try-catch塊是沒有作用的,與上面的代碼一樣在控制檯拋出異常:

 問題解決

 爲了解決上述問題,我們需要修改Executor產生線程的方式。使用Thread.UncaughtExceptionHandler接口,它允許在每個線程對象上附着一個異常處理器,會在線程因未捕獲異常導致將要死亡時被調用。

HandlerThreadFactory類實現了ThreadFacotry接口,把實例化的對象作爲參數傳給Executors.newCachedThreadPool()方法,之後使用返回的ExecutorService創建的線程都會具有相同的線程配置。在這裏我們通過setUncaughtExceptionHandler()方法設置了異常捕獲處理器。

 上面的代碼中是按照具體情況設置的處理器,如果已知在代碼中每個地方都使用相同的異常處理器,可以設置默認的異常處理器。這個處理器只有在不存在線程專有異常處理器的情況下才會被調用。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章