JDK執行緒池異常處理方式

songoo發表於2022-01-07

1. 丟擲異常

execute()

java.util.concurrent.ThreadPoolExecutor#runWorker 中丟擲,丟擲之後經過以下兩個步驟:

catch塊捕獲,捕獲之後再丟擲給JVM,JVM呼叫java.lang.Thread#dispatchUncaughtException 處理;

  dispatchUncaughtException最後將異常交給uncaughtExceptionHandler處理,這意味著可以自定義uncaughtExceptionHandler處理異常;

finally塊裡呼叫java.util.concurrent.ThreadPoolExecutor#afterExecute 處理。

  此方法是一個protected方法,意味著子類可以覆蓋afterExecute 方法,實現自己的異常處理邏輯。

submit()

java.util.concurrent.FutureTask#run 中丟擲異常後會被捕獲,不會拋給JVM,而是呼叫setException方法將異常設定給輸出outcome;

最後呼叫java.util.concurrent.FutureTask#get() 獲取執行緒執行結果時將異常丟擲

 

2. 異常處理方式

execute()

  a.業務程式碼內部try-catch處理

  b.自定義執行緒的uncaughtExceptionHandler

  c.覆蓋執行緒池的afterExecute()方法

 

submit()

  業務程式碼內部try-catch處理

相關文章