Issue
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?
Solution
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:
- the first
corePoolSize
submissions will start a new thread each; - after that, all submissions go to the queue;
- if the queue is finite and its capacity is exhausted, each submission starts a new thread, until there are
maxPoolSize
threads in the pool; - when both the pool and the queue are full, new submissions are rejected.
Answered By - kewne