code: public ScheduledFuture<T> submitAfter(long delay, TimeUnit unit, ScheduledExecutorService executor)
      {
          Checks.notNull(executor, "Scheduler");
          Checks.notNull(unit, "TimeUnit");
          return executor.schedule((Callable<T>) new ContextRunnable((Callable<T>) this::complete), delay, unit);
      }
docs: Schedules a call to {@link #complete()} to be executed after the specified {@code delay}.
  <br>This is an <b>asynchronous</b> operation that will return a
  {@link java.util.concurrent.ScheduledFuture ScheduledFuture} representing the task.
  
  <p>The returned Future will provide the return type of a {@link #complete()} operation when
  received through the <b>blocking</b> call to {@link java.util.concurrent.Future#get()}!
  
  <p>The specified {@link java.util.concurrent.ScheduledExecutorService ScheduledExecutorService} is used for this operation.
  
  @param  delay
  The delay after which this computation should be executed, negative to execute immediately
  @param  unit
  The {@link java.util.concurrent.TimeUnit TimeUnit} to convert the specified {@code delay}
  @param  executor
  The Non-null {@link java.util.concurrent.ScheduledExecutorService ScheduledExecutorService} that should be used
  to schedule this operation
  
  @throws java.lang.IllegalArgumentException
  If the provided TimeUnit or ScheduledExecutorService is {@code null}
  
  @return {@link java.util.concurrent.ScheduledFuture ScheduledFuture}
  representing the delayed operation