2017-06-19 51 views
1

我使用Spring 4.3.8.RELEASE與Java 7.我想創建一個線程池來執行任務,所以我成立了我的春節contxet什麼是ThreadPoolTask​​Executor的Spring默認隊列大小?

<bean id="myThreadFactory" class="org.springframework.scheduling.concurrent.CustomizableThreadFactory"> 
    <constructor-arg value="mythread-"/> 
</bean> 
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
    <property name="threadFactory" ref="myThreadFactory"/> 
    <property name="corePoolSize" value="10" /> 
    <property name="maxPoolSize" value="50" /> 
</bean> 

爲了不壓碎機下面CPU使用率,我想限制系統中可以存在的併發線程數量(我認爲這是maxPOolSize所做的)。但我不想讓任務掉線。如果我向taskPoolExecutor添加50多個任務,那麼51號會發生什麼?更重要的是,在開始掉線之前可以添加的默認任務數是多少?

+0

默認值是'Integer.MAX_VALUE',意思是無界的。請參閱https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/concurrent/ThreadPoolTask​​Executor.html#setQueueCapacity-int-。 –

回答

1

設置maxPoolSize隱式允許任務被丟棄。 但是,默認隊列容量爲Integer.MAX_VALUE,實際用途爲無窮大。

事情需要提防的是,ThreadPoolTaskExecutor使用ThreadPoolExecutor下,具有不同尋常的方法來排隊,在the docs描述:

如果corePoolSize或多個線程運行,執行程序始終喜歡排隊請求而不是添加新線程。

這意味着maxPoolSize只與隊列滿時有關,否則線程數永遠不會超過corePoolSize。 作爲一個例子,如果我們提交任務從未完整線程池:

  • 第一corePoolSize提交將啓動一個新線程的每個;
  • 之後,所有提交到隊列;
  • 如果隊列是有限的並且其容量已用盡,則每次提交都會啓動一個新線程,最多爲maxPoolSize;
  • 當池和隊列都滿時,新的提交被拒絕。
+0

我並沒有把你所說的東西捆綁在一起。如果隊列是無限的,它永遠不會滿,對嗎?因此,如果我的核心池大小爲10,最大池大小爲50,那麼添加第51個線程時會發生什麼? – Dave

+0

我編輯了我的答案來提供一個例子,它有幫助嗎? – kewne

+0

我這麼認爲。所以在我的代碼中,我沒有爲隊列大小指定一個值。那麼這是否意味着我的maxPoolSize指定的參數是無意義的,因爲隊列的默認大小是無限的? – Dave

相關問題