1. 程式人生 > >Executor執行緒池的最佳執行緒數量計算

Executor執行緒池的最佳執行緒數量計算

如果是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中沒有顯示的宣告,少糖語言是出了名的。。。