ExecutorService vs ThreadPoolExecutor using LinkedBlockingQueue ExecutorService vs ThreadPoolExecutor using LinkedBlockingQueue multithreading multithreading

ExecutorService vs ThreadPoolExecutor using LinkedBlockingQueue


Here is the source of Executors.newFixedThreadPool:

 public static ExecutorService newFixedThreadPool(int nThreads) {    return new ThreadPoolExecutor(nThreads, nThreads,                                  0L, TimeUnit.MILLISECONDS,                                  new LinkedBlockingQueue<Runnable>());}

It internally uses ThreadPoolExecutor class with default configuration as you can see above. Now there are scenarios where default configuration is not suitable say instead of LinkedBlockingQueue a priority queue needs to be used etc. In such cases caller can directly work on underlying ThreadPoolExecutor by instantiating it and passing desired configuration to it.


then that will make any difference?

It will make your code more complicated for little benefit.

I am trying to understand what is the difference between my original code which is using ExecutorService and the new code, that I pasted which is using ThreadPoolExectuor?

Next to nothing. Executors creates a ThreadPoolExecutor to do the real work.

Some of my team mates said second one (ThreadPoolExecutor) is right way to use?

Just because it's more complicated doesn't mean it's the right thing to do. The designers provided the Executors.newXxxx methods to make life simpler for you and because they expected you to use those methods. I suggest you use them as well.


  1. Executors#newFixedThreadPool(int nThreads)

    ExecutorService executor = Executors.newFixedThreadPool(20);

is basically

 return new ThreadPoolExecutor(20, 20,                                  0L, TimeUnit.MILLISECONDS,                                  new LinkedBlockingQueue<Runnable>());

2.

BlockingQueue<Runnable> threadPool = new LinkedBlockingQueue<Runnable>();ThreadPoolExecutor tpExecutor = new ThreadPoolExecutor(20, 2000, 0L,    TimeUnit.MILLISECONDS, threadPool);

In the second case, you are just increasing the maxPoolSize to 2000, which I doubt you would need.