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はどうなりますか?さらに重要なこととして、ドロップされる前に追加できるタスクのデフォルト数はいくつですか?
maxPoolSize
を設定すると、タスクが暗黙的に削除されます。ただし、デフォルトのキュー容量はInteger.MAX_VALUE
、これは実用的な目的では無限大です。
ThreadPoolTaskExecutor
はその下でThreadPoolExecutor
を使用することに注意してください。これは、キューイングにやや珍しいアプローチがあり、 the docs で説明されています:
corePoolSize
以上のスレッドが実行されている場合、エグゼキュータは新しいスレッドを追加するよりも常に要求をキューに入れることを優先します。
つまり、maxPoolSize
はキューがいっぱいの場合にのみ関連し、それ以外の場合はスレッドの数がcorePoolSize
を超えて増えることはありません。例として、完了しないタスクをスレッドプールに送信すると:
corePoolSize
送信は、それぞれ新しいスレッドを開始します。maxPoolSize
までの新しいスレッドが開始されます。