2013-07-15 133 views
13

當一個新的任務,方法execute(java.lang.Runnable)被提交,只有不到corePoolSize線程在運行,創建一個新的線程來處理請求,即使其他輔助線程是空閒的。的ThreadPoolExecutor - 核心和最大池大小

1)爲什麼有需要創建一個新的線程來處理請求,如果有空閒的線程?

如果有多於corePoolSize但小於maximumPoolSize的線程正在運行,則只有在隊列已滿時纔會創建一個新線程。

2)我不明白corePoolSizemaximumPoolSize這裏的區別。其次,當線程小於maximumPoolSize時,如何滿足一個隊列?如果線程等於或大於maximumPoolSize,隊列只能是滿的。不是嗎?

+1

1.如何執行()知道你的其他工作線程處於空閒狀態?當你完成它們後,你把它們還給了游泳池嗎? –

+0

2.聽起來像ThreadPoolExecutor試圖維護一個比corePoolSize大但小於maximumPoolSize的可用線程池。 –

+0

@RobertHarvey請發表這個答案。 – zEro

回答

8

您可以在javadoc中找到術語corepoolsize和maxpoolsize的定義。 http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html

上面的鏈接有你的問題的答案。但是,只是爲了說清楚。應用程序將創建線程,直到它到達corePoolSize。這意味着這些線程數應該足以處理任務的流入。之後,任務將排隊。一旦隊列滿了,執行程序將開始創建新線程。這是一種平衡。它實質上意味着任務的流入不僅僅是處理能力。所以,Executor會再次開始創建新線程,直到達到最大線程數。同樣,當且僅當隊列已滿時纔會創建新線程。

5

核心和最大池大小

甲的ThreadPoolExecutor將根據corePoolSize和maximumPoolSize設定的界限自動調整池大小。

當在方法execute(java.lang.Runnable)中提交新任務並且少於corePoolSize線程正在運行時,即使其他工作線程處於空閒狀態,也會創建一個新線程來處理請求。如果有多於corePoolSize但小於maximumPoolSize線程正在運行,則只有在隊列已滿時纔會創建新線程。通過將corePoolSize和maximumPoolSize設置爲相同,您將創建一個固定大小的線程池。

通過將maximumPoolSize設置爲基本上無界的值(例如Integer.MAX_VALUE),您允許池容納任意數量的併發任務。最典型的情況是,核心和最大池大小僅在施工時設置,但也可以使用setCorePoolSize(int)setMaximumPoolSize(int)動態更改。 link

+0

請嘗試格式化您的答案以提高可讀性。 – harpun

14

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

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

Full article