我必須發送massEmails給網站的所有用戶。我想爲發送的每封電子郵件使用線程池。目前,我已將值設置爲:Spring的ThreadPoolTaskExecutor中的corePoolSize和maxPoolSize之間的區別
<property name="corePoolSize" value="500" />
<property name="maxPoolSize" value="1000" />
這兩者之間的區別是什麼,它是否會縮放。目前我有約。 10000個用戶。
我必須發送massEmails給網站的所有用戶。我想爲發送的每封電子郵件使用線程池。目前,我已將值設置爲:Spring的ThreadPoolTaskExecutor中的corePoolSize和maxPoolSize之間的區別
<property name="corePoolSize" value="500" />
<property name="maxPoolSize" value="1000" />
這兩者之間的區別是什麼,它是否會縮放。目前我有約。 10000個用戶。
corePoolSize
是池使用的最小線程數。該數字可以增加到maxPoolSize
。當負載下降時,池會縮回到corePoolSize
。
發送電子郵件似乎是一個I/O綁定操作。我不認爲有500個線程會讓它更快。
當一個新的 任務提交[...],並 少於
corePoolSize
線程 運行,一個新的線程創建 處理請求,即使其他 工作線程閒置。如果有 多於corePoolSize
但小於maximumPoolSize
線程正在運行,則只有 隊列已滿時纔會創建 新線程。通過設置corePoolSize
和maximumPoolSize
相同,您創建一個固定大小 線程池。通過將maximumPoolSize
設置爲本質上爲 的無限值(例如Integer.MAX_VALUE
),您允許 池容納任意數量的併發任務。
至於你的具體情況,同時發送500封電子郵件是毫無意義的,你只會壓倒郵件服務器。如果您需要發送大量電子郵件,請使用單個線程,然後一次將其發送到管道。郵件服務器將比500個單獨的連接處理得更優雅。
你應該考慮增加queueCapacity的價值不是考慮增加corePoolSize或maxPoolSize的價值。這兩個屬性(* 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。
隊列容量「爲每封電子郵件線程池」是Integer.MAX_VALUE的默認,所以沒必要增加它! – rlm 2016-03-24 16:24:25
下面是Sun的深入淺出的線程創建規則:
我把你的意思是「每個電子郵件線程」,不 – skaffman 2009-12-10 08:33:25