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
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
;Be aware of using the default ThreadPoolTaskExecutor
if many @Async
tasks are executed.
As of Spring Boot 2.1 there is a default ThreadPoolTaskExecutor
with a default core size of eight threads. Although the max pool size is still infinity¹ and new threads can be theoretically created the queue size of this pool is infinity¹ as well.
The queue size will probably never hit and new threads will never be created.
At least set the queue size if @Async
is used:
spring.task.execution.pool.queue-capacity=16
¹ infinity as in 2147483647 a.k.a. Integer.MAX_VALUE