Executor線程池的最佳線程數量計算


如果是IO密集型應用,則線程池大小設置為2N+1;

如果是CPU密集型應用,則線程池大小設置為N+1;

N代表CPU的核數。

假設我的服務器是4核的,且一般進行大數據運算,cpu消耗較大,那么線程池數量設置為5為最優。

(現在很多項目線程池濫用,注意分配線程數量,建議不要動態創建線程池,盡量將線程池配置在配置文件中,這樣方便以后整體的把控和后期維護。每個核心業務線程池要互相獨立,互不影響。)

例子(spring):

 


   
   
  
  
          
  1. <bean class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"
  2. id= "userPrivacyDataObtainThreadPool">
  3. <!-- 核心線程數 -->
  4. <property value="6" name="corePoolSize"/>
  5. <!-- 最大線程數 -->
  6. <property value="10" name="maxPoolSize"/>
  7. <!-- 隊列最大長度 >=mainExecutor.maxSize -->
  8. <property value="200" name="queueCapacity"/>
  9. <!-- 線程池維護線程所允許的空閑時間 -->
  10. <property value="300" name="keepAliveSeconds"/>
  11. <!-- 線程池對拒絕任務(無線程可用)的處理策略 -->
  12. <property name="rejectedExecutionHandler">
  13. <bean class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy"/>
  14. </property>
  15. </bean>

再附上scheduler定時任務的線程池配置:


   
   
  
  
          
  1. <!--項目內定時任務 -->
  2. <bean id="scheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
  3. <!-- 設置線程池容量,也是最大並發線程數 -->
  4. <property name="poolSize" value="2" />
  5. <!-- 當任務被取消的同時從當前調度器移除 -->
  6. <property name="removeOnCancelPolicy" value="true" />
  7. <!-- 線程名前綴 -->
  8. <property name="threadNamePrefix" value="cashpay-scheduler-" />
  9. <!-- 設置線程池中任務的等待時間,如果超過這個時候還沒有銷毀就強制銷毀 -->
  10. <property name="awaitTerminationSeconds" value="60" />
  11. <!-- 當調度器shutdown被調用時等待當前被調度的任務完成 -->
  12. <property name="waitForTasksToCompleteOnShutdown" value="true" />
  13. <!-- 線程池對拒絕任務(無線程可用)的處理策略 -->
  14. <property name="rejectedExecutionHandler">
  15. <bean class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy"/>
  16. </property>
  17. </bean>

注:java代碼往線程池中添加線程時,需要用try...catch...包含,因為可能會因為線程池隊列滿而拋出異常(見rejectedExecutionHandler)(雖然這種情況不多見),java中沒有顯示的聲明,少糖語言是出了名的。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM