web-dev-qa-db-ja.com

ThreadPoolTask​​Executorを使用したSpringのデフォルトのキューサイズはいくつですか?

Java 7.でSpring 4.3.8.RELEASEを使用しています。7。タスクを実行するスレッドプールを作成したいので、Spring contxetに次のように設定しました

<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はどうなりますか?さらに重要なこととして、ドロップされる前に追加できるタスクのデフォルト数はいくつですか?

7
Dave

maxPoolSizeを設定すると、タスクが暗黙的に削除されます。ただし、デフォルトのキュー容量はInteger.MAX_VALUE、これは実用的な目的では無限大です。

ThreadPoolTaskExecutorはその下でThreadPoolExecutorを使用することに注意してください。これは、キューイングにやや珍しいアプローチがあり、 the docs で説明されています:

corePoolSize以上のスレッドが実行されている場合、エグゼキュータは新しいスレッドを追加するよりも常に要求をキューに入れることを優先します。

つまり、maxPoolSizeはキューがいっぱいの場合にのみ関連し、それ以外の場合はスレッドの数がcorePoolSizeを超えて増えることはありません。例として、完了しないタスクをスレッドプールに送信すると

  • 最初のcorePoolSize送信は、それぞれ新しいスレッドを開始します。
  • その後、すべての送信はキューに入れられます。
  • キューが有限で容量がなくなった場合、送信ごとに最大maxPoolSizeまでの新しいスレッドが開始されます。
  • プールとキューの両方がいっぱいになると、新しい送信は拒否されます。
16
kewne