2011-09-20 41 views
5

我想了解爲Java 5的ThreadPoolExecutor指定單獨的核心和最大池大小的要點。我的理解是線程的數量只會在隊列滿時增加,這似乎有點遲(至少在隊列較大時)。當在ThreadPoolExecutor中指定單獨的核心和最大池大小時,一個好主意是什麼?

難道我不是很樂意爲任務分配大量的線程,在這種情況下,我可能只是增加核心池的大小;或者我真的不願意這樣做,在這種情況下,我寧願有一個更大的隊列?什麼情況下單獨的核心和最大池大小是有用的?

回答

2

不同之處在於,如果您低於核心池大小,則每個新任務都將創建一個新線程,而不管池中的空閒線程如何。只有在滿足核心池大小但仍低於最大值的隊列滿後,線程數纔會增加。

這是一個完美的例子,當你有一個系統,你不知道它會有多少併發負載(例如一個web服務器)。該功能允許您指定一組核心線程,可能基於您的機器的核心數量,但允許負載超出您的預期。

如果您的I/O負載超過您的預期,並且您的池中的線程花費了大量時間阻塞,這將特別有用。在這種情況下,您的隊列可以很容易地填滿而不會有很大的併發負載,並且可以通過添加一些新線程來處理更多的併發請求,從而輕鬆解決問題。

+1

但是,然後我可以運行更多的線程開始 - 否則我只是在隊列中等待的任務添加延遲。我還懷疑,在隊列填充的許多情況下,它可能會填滿很快,在這種情況下,其他線程可能來不及。 –

+0

@Peter,如果你的靜態分析足以預測正確數量的線程在超負載情況下使用,並且你對在正常負載期間使用這些額外的線程感到高興,那就去吧!這是在負載下的一次性線程起轉時間與低負載時額外資源使用之間的折衷。 – Bringer128

4

有這個here的討論。

池的目的是在corePoolSize的正常負載下工作(至 ,除非使用預啓動,否則它會加速)。當發生過載情況(通過比工作更多的待處理/正在處理中的 任務來定義)時,我們使用隊列充當緩衝區 - 期望正常工作負載將在接近 未來恢復。如果我們擔心過度過載,那麼我們可以使用有界隊列,並且表示「如果隊列填滿,則將更多工作人員 添加到maxPoolSize」。如果我們使用無限隊列,我們​​說我們不期望(或者不關心)過度超載。

目的是要平衡處理預期的工作量的能力,甚至 在瞬態過載,而無需過多的線程 創建和沒有太多線索流失率(即 創建工作模創建)。

+0

鏈接已死? –

+1

這是很好的解釋!更正了死鏈接。答案中指出的討論可以在http://comments.gmane.org/gmane.comp.java.jsr.166-concurrency/7109找到。 – Shailendra

相關問題