code: @Override
    public ExecutorService getListenerExecutorService() {
      if (executorService == null) {
        ThreadFactory threadFactory = new ThreadFactory() {
          @Override
          public Thread newThread(Runnable r) {
            return new Thread(r, "FutureNotifyListener");
          }
        };
  
        executorService = new ThreadPoolExecutor(
          0,
          Runtime.getRuntime().availableProcessors(),
          60L,
          TimeUnit.SECONDS,
          new LinkedBlockingQueue<Runnable>(),
          threadFactory
        );
      }
  
      return executorService;
    }
docs: Returns the stored {@link ExecutorService} for listeners.
  
  By default, a {@link ThreadPoolExecutor} is used that acts exactly
  like a default cachedThreadPool, but defines the upper limit of
  Threads to be created as the number of available processors to
  prevent resource exhaustion.
  
  @return the stored {@link ExecutorService}.