code: public List<Either<T, ExecutionException>> executeAndGetResults() throws InterruptedException {
      List<Either<T, ExecutionException>> results = Lists.newArrayList();
      List<Future<T>> futures = execute();
      for (Future<T> future : futures) {
        try {
          results.add(Either.<T, ExecutionException>left(future.get()));
        } catch (ExecutionException ee) {
          results.add(Either.<T, ExecutionException>right(ee));
        }
      }
      return results;
    }
docs: Execute the tasks in the task {@link Iterator}. Blocks until all tasks are completed. Gets the results of each
  task, and for each task returns either its result or the thrown {@link ExecutionException}.
  
  @return a list containing for each task either its result or the {@link ExecutionException} thrown, in the same
  order as the input {@link Iterator}.
  @throws InterruptedException