執行緒池可以吞掉異常

2021-07-25 03:31:10 字數 1320 閱讀 8753

執行緒池很好的幫助開發者解決了執行緒復用的問題,同時也提供了很好的容錯性,然而有的時候幫我們做了很多的事情,如果發生了異常會造成查詢系統異常的困難。先看一段程式,看看會發生什麼。

// 工作執行緒,執行除法操作

public class divtask implements runnable

public void run()

}

public class threadpooleatexception 

}}

執行結果:

從程式中很明顯看出,應該是會列印三條資訊,但結果卻是只有二條,很明顯除數為0的結果沒有列印出來。仔細看submit() 方法,會發現有返回值。再看下面的**。

看threadpoolexecutor的原始碼發現,該類提供了execute()方法。

可以看到該堆疊資訊和前面的比起來少了很多,少的主要是缺少執行緒池執行的地方。看一下執行緒池的類關係圖。

executorservice和executor是介面,構成父子關係,executor是頂層介面,只有乙個方法,executorservice繼承了executor介面,新增了很多額外的方法。抽象類abstractexecutorservice實現了executorservice介面,必然實現了submit方法,而threadpoolexecutor繼承了abstractexecutorservice,除了能呼叫submit方法外還額外提供了execute方法,execute方法沒有把異常吃掉,發生異常會直接丟擲來。executors和其他的類和介面都沒有關係,個人認為其僅僅是乙個工具類,包裝了若干個初始化執行緒池的方法,這樣方法都只需要傳入執行緒數量等引數,不需要像threadpoolexecutor一樣初始化時需要提供很多引數,進一步簡化了開發者的門檻。

Java執行緒池異常處理原理

executorservice exec executors.newfixedthreadpool 8 以上述 為例,得到executorservice例項後,我們可以通過兩種方式提交任務 runnable exec.execute runnable 和 exec.submit runnable e...

python執行緒池異常處理方案

from multiprocessing.pool import threadpool 建立乙個執行緒池 pool size 4 thread pool threadpool pool size 呼叫map方法,將會對迭代物件拆包並各自開啟執行緒交由目標函式處理 pool output thread...

Hystrix異常處理及執行緒池劃分

在hystrixcommand實現的run 方法中丟擲異常時,除了hystrixbadrequestexception之外,其他異常均會被hystrix認為命令執行失敗並觸發服務降級的處理邏輯,所以當需要在命令執行中丟擲不觸發服務降級的異常時來選擇它。在使用註解配置實現hystrix命令時,可以忽略...