code: public static ThreadPoolExecutor createDefaultThreadPoolExecutor(int corePoolSize,
                                                                       int maximumPoolSize,
                                                                       long keepAliveTime,
                                                                       TimeUnit unit) {
          return new StringMappedThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, new LinkedBlockingQueue<Runnable>(),
                  new ThreadFactory() {
  
                      @Override
                      public Thread newThread(Runnable r) {
                          return new Thread(r);
                      }
                  });
      }
docs: Utility method to create a new StringMappedThreadPoolExecutor (which can be used to inspect runnables).
  
  @param corePoolSize    the number of threads to keep in the pool, even if they are idle, unless allowCoreThreadTimeOut is set
  @param maximumPoolSize the maximum number of threads to allow in the pool
  @param keepAliveTime   when the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating.
  @param unit            the time unit for the keepAliveTime argument
  @return a StringMappedThreadPoolExecutor created from given arguments.