code: public void start(ExecutorService executorService, Callable<Future<R>> innerTask, ThreadContextDescriptor threadContext) {
          synchronized (this) {
              this.innerTask = innerTask;
              this.threadContext = threadContext;
              //set up the future to hold the result
              this.resultFuture = new CompletableFuture<Future<R>>();
              //submit the innerTask (wrapped by this) for execution
              this.taskFuture = executorService.submit(this);
          }
      }
docs: Submit this task for execution by the given executor service.
  
  @param executorService the executor service to use
  @param innerTask the task to run
  @param threadContext the thread context to apply when running the task