Executor執行緒池的最佳執行緒數量計算
阿新 • • 發佈:2019-02-16
如果是IO密集型應用,則執行緒池大小設定為2N+1;
如果是CPU密集型應用,則執行緒池大小設定為N+1;
N代表CPU的核數。
假設我的伺服器是4核的,且一般進行大資料運算,cpu消耗較大,那麼執行緒池數量設定為5為最優。
(現在很多專案執行緒池濫用,注意分配執行緒數量,建議不要動態建立執行緒池,儘量將執行緒池配置在配置檔案中,這樣方便以後整體的把控和後期維護。每個核心業務執行緒池要互相獨立,互不影響。)
例子(spring):
<bean class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" id="userPrivacyDataObtainThreadPool"> <!-- 核心執行緒數 --> <property value="6" name="corePoolSize"/> <!-- 最大執行緒數 --> <property value="10" name="maxPoolSize"/> <!-- 佇列最大長度 >=mainExecutor.maxSize --> <property value="200" name="queueCapacity"/> <!-- 執行緒池維護執行緒所允許的空閒時間 --> <property value="300" name="keepAliveSeconds"/> <!-- 執行緒池對拒絕任務(無執行緒可用)的處理策略 --> <property name="rejectedExecutionHandler"> <bean class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy"/> </property> </bean>
再附上scheduler定時任務的執行緒池配置:
<!--專案內定時任務 --> <bean id="scheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler"> <!-- 設定執行緒池容量,也是最大併發執行緒數 --> <property name="poolSize" value="2" /> <!-- 當任務被取消的同時從當前排程器移除 --> <property name="removeOnCancelPolicy" value="true" /> <!-- 執行緒名字首 --> <property name="threadNamePrefix" value="cashpay-scheduler-" /> <!-- 設定執行緒池中任務的等待時間,如果超過這個時候還沒有銷燬就強制銷燬 --> <property name="awaitTerminationSeconds" value="60" /> <!-- 當排程器shutdown被呼叫時等待當前被排程的任務完成 --> <property name="waitForTasksToCompleteOnShutdown" value="true" /> <!-- 執行緒池對拒絕任務(無執行緒可用)的處理策略 --> <property name="rejectedExecutionHandler"> <bean class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy"/> </property> </bean>
注:java程式碼往執行緒池中新增執行緒時,需要用try...catch...包含,因為可能會因為執行緒池佇列滿而丟擲異常(見rejectedExecutionHandler)(雖然這種情況不多見),java中沒有顯示的宣告,少糖語言是出了名的。。。