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