code: public List<T> results(long timeout, TimeUnit unit)
              throws InterruptedException, TimeoutException {
          synchronized (this) {
              if (completed) {
                  return results == null ? Collections.emptyList()
                      : Collections.unmodifiableList(results);
              }
              wait(unit.toMillis(timeout));
          }
          if (completed) {
              return results == null ? Collections.emptyList()
                  : Collections.unmodifiableList(results);
          }
          throw new TimeoutException();
      }
docs: Causes the invoking thread to wait until the processing of the
  event has been completed (see {@link #isDone()}) or given timeout
  has expired and returns the list of results (which may be empty
  if the event's result type is {@link Void}).
  
  @return the results
  @see java.util.concurrent.Future#get(long, java.util.concurrent.TimeUnit)