Java線程池線程數量確定思路
多線程可以快速執行任務的原理
因為服務器是擁有多個處理器核心的。運行某進程時,如果只有一個線程,則只能調動一個處理器核心,其他處理器核心可能處於空閑狀態。如果是多線程,則可以調用多個處理器核心,用最大效率去處理任務。
創建線程池需要的參數
- 創建線程池一般需要參數有:核心線程數,最大線程數,線程銷毀時間,任務隊列,拒絕策略等。
- 線程池里的線程分為兩種,分別是核心線程和非核心線程。當線程池接收到任務時,會先創建核心線程數去處理任務,直至待處理的任務數量超過任務隊列長度和核心線程數之和時,會繼續創建非核心線程直至最大線程數。
- 線程池接收到的任務數量在即將超過任務隊列長度和最大線程數之和時,會觸發拒絕策略處理該任務。
- 非核心線程在執行完成后會立即銷毀,核心線程則會等待設置的銷毀時間后再進行銷毀。
- 當任務隊列長度足夠大時,核心線程數和最大線程數相等,不然不能觸發到創建非核心線程
確定線程數
-
線程數計算公式為:
Nthreads=NcpuUcpu(1+w/c) =Ncpu*(1+w/c)。
其中 Nthreads:線程數;Ncpu:處理器核心數;Ucpu:處理器的使用百分比;W/C:等待時間與計算時間的比率
-
Ncpu可以通過以下代碼獲取
Runtime.getRuntime().availableProcessors()
-
等待時間與計算時間的比率
- 針對IO密集型的,阻塞耗時w一般都是計算耗時幾倍c,假設阻塞耗時=計算耗時的情況下,Nthreads=Ncpu*(1+1)=2Ncpu。所以這種情況下,考慮2倍的CPU核心數做為線程數
- 對於計算密集型的,阻塞耗時趨於0,即w/c趨於0,公式Nthreads = Ncpu。
-
線程數一般是處理器核心數的整數倍。線程數設置過多,在多任務並發情況下,則會影響服務器的整體運行速度;設置過少,則不能最大化應用服務器性能。所以需要根據具體業務來具體調整。