Java執行緒池應該如何使用?

時間 2021-06-01 10:06:42

1樓:半圓學社

執行緒池應該在程式啟動的時候進行初始化,中間只要不出現異常或沒有特殊需求則可以不關閉。執行緒的建立和銷毀要花費時間,使用執行緒池可以復用執行緒,執行緒池可以設定核心執行緒數量,核心執行緒處理完任務後,並不會銷毀,而是保持空閒直到下一次有執行緒需要建立時,直接執行任務。

2樓:隨心隨意

說點我的理解,只供參考。

執行緒池主要是為了管理執行緒,執行緒復用和控制數量。

為什麼?新建執行緒涉及到系統呼叫,比較耗效能,所以爭取復用。

怎麼復用呢?拿常用執行緒池來說,任務和執行緒單獨,執行緒run方法邏輯就是一直獲取任務然後執行任務邏輯,完成乙個繼續獲取下乙個任務。

拿web專案(tomcat)來說,執行業務邏輯的執行緒是tomcat工作執行緒池管理的,再弄新的幹嘛?

一般情況沒意義,但有些時候可以,前端不需要響應的,可以非同步處理。當前業務邏輯可能有多個子任務的,可以考慮並行處理。大任務需要拆解小任務然後並行處理的。

任務需要隔離的,比如說乙個執行緒池專門處理大任務,乙個處理小任務,這樣小任務可以快速被完成而不會因為大任務被阻塞太久,拿微服務中的hystrix來說,不同服務呼叫不能被影響吧,每個服務單獨執行緒池隔離。上面雖然可能會有執行緒過多導致執行緒切換,但也沒那麼恐怖,和所得相比微乎其微,權衡取捨的問題。

拿你的問題來說,執行緒池全域性使用,程式開始的時候新建,結束關閉。

建議再好好考慮幾個問題,多執行緒的意義?優點和缺點?執行緒池工作原理?執行緒池在web容器中起了什麼作用?

java執行緒池(newFixedThreadPool)執行緒消失疑問?

原始碼看不看不重要,建議詳細看一下 jdk 自帶執行緒池的文件。jdk 自帶執行緒池中線程何時銷毀是由執行緒池的多個引數綜合決定的,所以使用者提交的執行緒中是否丟擲了異常對執行緒池中線程的銷毀是沒有影響的。如果使用者提交的執行緒丟擲了異常會退出使用者執行緒的 run 方法,執行執行緒是否需要銷毀由執...

如何避免資料庫不響應導致資料庫執行緒池和業務執行緒池全部掛起?

資料庫讀寫執行緒做超時,哪怕非同步了,堵住了沒有超時一樣會死。再用個守護執行緒去檢測這些排隊的情況,一旦超出閾值就報警吧。在一般業務併發處理中,能丟擲主業務就丟擲主業務,讓主業務能最大併發處理。當然如果在主業務中資料庫響應很慢,而且持續時間很長,那麼無論執行緒池中多少個執行緒 執行緒無線多也不是什麼...

學習java應該如何理解反射?

zhdbmwaj 舉個例子。有一些框架會把所有的類名全部以string型別放在乙個xml檔案中。有時因為一些特殊的情況我們不能直接new物件。這時直接用反射通過字串型的類名來新建物件就很方便了。甚至反射可以直接使用和獲取私有物件和方法 Boyka 反射,一些比較粗淺的理解來說,就是通過物件來得到類的...