code: @Override
      public File call() throws Exception {
          try {
              latch.await();
  
              if (isTimeoutEnabled()) {
                  timedExecutor.schedule(new Runnable() {
                      public void run() {
                          try {
                              if (download.getState() != TransferState.Completed) {
                                  download.abort();
                              }
                          } catch (Exception e) {
                              throw new SdkClientException(
                                  "Unable to abort download after timeout", e);
                          }
                      }
                  }, timeout, TimeUnit.MILLISECONDS);
              }
  
              download.setState(TransferState.InProgress);
              createParentDirectoryIfNecessary(dstfile);
  
              if (isDownloadParallel) {
                  downloadInParallel(ServiceUtils.getPartCount(req, s3));
              } else {
                  S3Object s3Object = retryableDownloadS3ObjectToFile(dstfile,
                                                                      new DownloadTaskImpl(s3, download, req));
                  updateDownloadStatus(s3Object);
              }
              return dstfile;
          } catch (Throwable t) {
              // Cancel all the futures
              for (Future<Long> f : futures) {
                  f.cancel(true);
              }
              // Downloads aren't allowed to move from canceled to failed
              if (download.getState() != TransferState.Canceled) {
                  download.setState(TransferState.Failed);
              }
              if (t instanceof Exception)
                  throw (Exception) t;
              else
                  throw (Error) t;
          }
      }
docs: This method must return a non-null object, or else the existing
  implementation in {@link AbstractTransfer#waitForCompletion()}
  would block forever.
  
  @return the downloaded file