2009-12-10 69 views
26

我必須發送massEmails給網站的所有用戶。我想爲發送的每封電子郵件使用線程池。目前,我已將值設置爲:Spring的ThreadPoolTask​​Executor中的corePoolSize和maxPoolSize之間的區別

<property name="corePoolSize" value="500" /> 
<property name="maxPoolSize" value="1000" /> 

這兩者之間的區別是什麼,它是否會縮放。目前我有約。 10000個用戶。

+2

我把你的意思是「每個電子郵件線程」,不 – skaffman 2009-12-10 08:33:25

回答

16

corePoolSize是池使用的最小線程數。該數字可以增加到maxPoolSize。當負載下降時,池會縮回到corePoolSize

發送電子郵件似乎是一個I/O綁定操作。我不認爲有500個線程會讓它更快。

29

The javadoc says it best

當一個新的 任務提交[...],並 少於corePoolSize線程 運行,一個新的線程創建 處理請求,即使其他 工作線程閒置。如果有 多於corePoolSize但小於 maximumPoolSize線程正在運行,則只有 隊列已滿時纔會創建 新線程。通過設置 corePoolSizemaximumPoolSize 相同,您創建一個固定大小 線程池。通過將 maximumPoolSize設置爲本質上爲 的無限值(例如 Integer.MAX_VALUE),您允許 池容納任意數量的併發任務。

至於你的具體情況,同時發送500封電子郵件是毫無意義的,你只會壓倒郵件服務器。如果您需要發送大量電子郵件,請使用單個線程,然後一次將其發送到管道。郵件服務器將比500個單獨的連接處理得更優雅。

3

你應該考慮增加queueCapacity的價值不是考慮增加corePoolSizemaxPoolSize的價值。這兩個屬性(* PoolSize)是池的數量來執行,但各消息將在queueCapacity

<property name="corePoolSize" value="5" /> 
<property name="maxPoolSize" value="10" /> 
<property name="queueCapacity" value="1000" /> 
<property name="waitForTasksToCompleteOnShutdown" value="true"/> 

會考慮如果你有10000個用戶發送所以1000 * 10大小(maxpoolsize)= 10000,但如果1000每個線程都很重,我們可以考慮增加poolSize。

+0

隊列容量「爲每封電子郵件線程池」是Integer.MAX_VALUE的默認,所以沒必要增加它! – rlm 2016-03-24 16:24:25

7

下面是Sun的深入淺出的線程創建規則:

  1. 如果線程數小於corePoolSize,創建一個新的線程來運行一個新的任務。
  2. 如果線程數等於(或大於)corePoolSize,則將該任務放入隊列中。
  3. 如果隊列已滿並且線程數小於maxPoolSize,則創建一個新線程來運行任務。
  4. 如果隊列已滿,且線程數大於或等於maxPoolSize ,拒絕任務。

Full article

Origin answer

相關問題