code: public static ListeningExecutorService getCachedSingleThreadExecutor(String name, long keepAlive) {
          return MoreExecutors.listeningDecorator(new ThreadPoolExecutor(
                  0,
                  1,
                  keepAlive,
                  TimeUnit.MILLISECONDS,
                  new LinkedBlockingQueue<Runnable>(),
                  CoreUtils.getThreadFactory(null, name, SMALL_STACK_SIZE, false, null)));
      }
docs: Get a single thread executor that caches its thread meaning that the thread will terminate
  after keepAlive milliseconds. A new thread will be created the next time a task arrives and that will be kept
  around for keepAlive milliseconds. On creation no thread is allocated, the first task creates a thread.
  
  Uses LinkedTransferQueue to accept tasks and has a small stack.