2017-06-19 16 views
1

私はマシンを鎮圧するためにSpringのデフォルトキューサイズはThreadPoolTask​​Executorで何ですか?私が設定しているので、私は、Java 7で春4.3.8.RELEASEを使用してい

<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> 

ないように、私の春のcontxetで次のタスクを実行するスレッドプールを作成したいです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です。実用上は無限大です。 corePoolSize以上のスレッドが実行されている場合

、エグゼキュータは常にキューイング好む:に注意する

何かがThreadPoolTaskExecutorthe docsで説明キューイングに幾分珍しいアプローチを、持っている、下ThreadPoolExecutorを使用していることです新しいスレッドを追加するのではなく、要求します。

これは、キューがいっぱいになったときmaxPoolSizeは、そうでない場合、スレッドの数がcorePoolSizeを超えて成長することはありません、唯一の関連性があることを意味しています。例として 、私たちは決して完全なスレッドプールにタスク提出する場合:

  • 最初corePoolSize提出がそれぞれの新しいスレッドを開始しますが、
  • その後、すべての送信がキューに移動します。
  • キューが有限で容量が使い果たされている場合、各サブミッションは新しいスレッドを開始します。最大ではmaxPoolSizeです。
  • プールとキューの両方がいっぱいの場合、新しい送信は拒否されます。
+0

私はあなたの言うことを結びつけていません。キューが無限大の場合、それは決して満杯にならないでしょう。私のコアプールのサイズが10で最大プールサイズが50の場合、51stスレッドを追加すると何hpapensですか? – Dave

+0

例を示すために私の答えを編集しましたが、それは役に立ちますか? – kewne

+0

そうだと思います。だから私のコードでは、私はキューのサイズの値を指定していない。つまり、キューのデフォルトサイズが無限大のため、maxPoolSizeの指定が無意味です。 – Dave

関連する問題