code: protected ExecutorService getExecutorService() {
          final int coreThreadCount = getCoreThreadCount();
          final int maxThreadCount = getMaximumThreadCount();
          final int threadPriority = getThreadPriority();
          if (coreThreadCount <= 0 || maxThreadCount <= 0) {
              throw new IllegalArgumentException("Thread count must be >= 1");
          } else {
              PriorityThreadPoolExecutor executor = PriorityThreadPoolExecutor
                  .getPriorityExecutor(coreThreadCount, maxThreadCount,
                      threadPriority);
              executor.setKeepAliveTime(getKeepAliveTime(), TimeUnit.NANOSECONDS);
              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
                  executor.allowCoreThreadTimeOut(getKeepAliveTime() != 0 && isCoreThreadDisposable());
              }
              return executor;
          }
      }
docs: Factory method to create an {@link ExecutorService} that will be used to
  execute requests. The default implementation of this method will create a
  single threaded or multi-threaded {@link ExecutorService} depending on
  the number of threads returned by {@link #getThreadCount()} and will
  assign them the priority returned by {@link #getThreadPriority()}.
  <p/>
  If you override this method in your service, you can supply a custom
  {@link ExecutorService}.
  <p/>
  This feature has been implemented following a request from Riccardo
  Ciovati.
  @return the {@link ExecutorService} to be used to execute requests .