code: public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
          return new ThreadPoolExecutor(nThreads, nThreads,
                                        0L, TimeUnit.MILLISECONDS,
                                        new LinkedBlockingQueue<Runnable>(),
                                        threadFactory);
      }
docs: Creates a thread pool that reuses a fixed number of threads
  operating off a shared unbounded queue, using the provided
  ThreadFactory to create new threads when needed.  At any point,
  at most {@code nThreads} threads will be active processing
  tasks.  If additional tasks are submitted when all threads are
  active, they will wait in the queue until a thread is
  available.  If any thread terminates due to a failure during
  execution prior to shutdown, a new one will take its place if
  needed to execute subsequent tasks.  The threads in the pool will
  exist until it is explicitly {@link ExecutorService#shutdown
  shutdown}.
  
  @param nThreads the number of threads in the pool
  @param threadFactory the factory to use when creating new threads
  @return the newly created thread pool
  @throws NullPointerException if threadFactory is null
  @throws IllegalArgumentException if {@code nThreads <= 0}