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處理