Note it is important to understand the relationship between coreSize , size , and queueSize . As explained in detail in the Javadoc for java.util.concurrent.ThreadPoolExecutor , a thread will not be added to the thread pool until the core size has been reached and the work queue has reached the queueSize capacity. This may lead to tasks not being performed as the number of core threads has been reached but the maximum queue size has not. In this case, the runtime will not add additional threads to process work. The correct approach is to set the coreSize to the maximum pool size and allowCoreThreadTimeOut to true. This will allow the thread pool to grow even if the maximum queue size has not been reached and non-utilized threads to be discarded. |