I'm using Spring 4.3.8.RELEASE with Java 7. I want to create a thread pool to execute tasks so I have set up the following in my 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>
So as not to crush machine CPU usage, I want to limit the amount of concurrent threads that can exist in the system (I assume that's what maxPOolSize does). But I don't want tasks to get dropped. If I add more than 50 tasks to my taskPoolExecutor, what happens to number 51? More importantly, what is the default number of tasks that can be added before they start getting dropped?
You can just autowire in your ThreadPoolTaskExecutor and get the queue with getThreadPoolExecutor(). getQueue() .
The corePoolSize is the minimum number of workers to keep alive without timing out. It is a configurable property of ThreadPoolTaskExecutor. However, the ThreadPoolTaskExecutor abstraction delegates setting this value to the underlying java. util.
Starting thread pool size is 1, core pool size is 5, max pool size is 10 and the queue is 100. As requests come in, threads will be created up to 5 and then tasks will be added to the queue until it reaches 100.
Thread pool type is fixed with a size of 1 , queue size of 16 .
Setting maxPoolSize
implicitly allows for tasks to get dropped.
However, the default queue capacity is Integer.MAX_VALUE
, which, for practical purposes, is infinity.
Something to watch out for is that ThreadPoolTaskExecutor
uses a ThreadPoolExecutor
underneath, which has a somewhat unusual approach to queueing, described in the docs:
If
corePoolSize
or more threads are running, the Executor always prefers queuing a request rather than adding a new thread.
This means that maxPoolSize
is only relevant when the queue is full, otherwise the number of threads will never grow beyond corePoolSize
.
As an example, if we submit tasks that never complete to the thread pool:
corePoolSize
submissions will start a new thread each;maxPoolSize
threads in the pool;If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With