Hello,
Wanted to write this down and have discussion about 
'java.util.concurrent.ThreadPoolExecutor' being used incorrectly in Ambari.

Almost all usages call the below constructor:

public ThreadPoolExecutor(
                              int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue)

Where typical values used are:

new ThreadPoolExecutor(
            20,
            100,
            30000L,
            TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<Runnable>()) // Unbounded queue

The weird thing about 'ThreadPoolExecutor' is that the number of threads 
increases from the 'corePoolSize' (20) to the 'maximumPoolSize' (100) ONLY when 
the BlockingQueue is full. Whenever we use an unbounded blocking queue, the 
number of threads never goes past the 'corePoolSize'.

The javadoc states: "If there are more than corePoolSize but less than 
maximumPoolSize threads running, a new thread will be created only if the queue 
is full"

So our thinking that the Executor will automatically increase the number of 
threads upto 'maximumPoolSize' and store overflowing requests into the queue 
(unbounded) is incorrect. Due to our usage, the number of threads never 
increases beyond 'corePoolSize'.

I do not understand the reason why it is implemented this way, but we run into 
performance issues by getting stuck with 'corePoolSize' thread count. I am 
looking into a fix for using ThreadPoolExecutor where the number of threads 
increases upto 'maximumPoolSize'.

Regards,
Srimanth?

Reply via email to