code: public StartedProcess start() throws IOException {
      WaitForProcess task = startInternal();
      ExecutorService service = newExecutor(task);
      Future<ProcessResult> future = invokeSubmit(service, task);
      // Previously submitted tasks are executed but no new tasks will be accepted.
      // However sub classes could return null as the ExecutorService
      if (service != null) {
        service.shutdown();
      }
      return new StartedProcess(task.getProcess(), future);
    }
docs: Start the sub process. This method does not wait until the process exits.
  Value passed to {@link #timeout(long, TimeUnit)} is ignored.
  Use {@link Future#get()} to wait for the process to finish.
  Invoke <code>future.cancel(true);</code> to destroy the process.
  
  @return Future representing the exit value of the finished process.
  @throws IOException an error occurred when process was started.