code: private UploadResult uploadPartsInSeries(UploadPartRequestFactory requestFactory) {
  
          final List<PartETag> partETags = new ArrayList<PartETag>();
  
          while (requestFactory.hasMoreRequests()) {
              if (threadPool.isShutdown()) throw new CancellationException("TransferManager has been shutdown");
              UploadPartRequest uploadPartRequest = requestFactory.getNextUploadPartRequest();
              // Mark the stream in case we need to reset it
              InputStream inputStream = uploadPartRequest.getInputStream();
              if (inputStream != null && inputStream.markSupported()) {
                  if (uploadPartRequest.getPartSize() >= Integer.MAX_VALUE) {
                      inputStream.mark(Integer.MAX_VALUE);
                  } else {
                      inputStream.mark((int)uploadPartRequest.getPartSize());
                  }
              }
              partETags.add(s3.uploadPart(uploadPartRequest).getPartETag());
          }
  
          CompleteMultipartUploadRequest req =
              new CompleteMultipartUploadRequest(
                  origReq.getBucketName(), origReq.getKey(), multipartUploadId,
                      partETags)
                      .withRequesterPays(origReq.isRequesterPays())
              .withGeneralProgressListener(origReq.getGeneralProgressListener())
              .withRequestMetricCollector(origReq.getRequestMetricCollector())
              ;
          CompleteMultipartUploadResult res = s3.completeMultipartUpload(req);
  
          UploadResult uploadResult = new UploadResult();
          uploadResult.setBucketName(res.getBucketName());
          uploadResult.setKey(res.getKey());
          uploadResult.setETag(res.getETag());
          uploadResult.setVersionId(res.getVersionId());
          return uploadResult;
      }
docs: Uploads all parts in the request in serial in this thread, then completes
  the upload and returns the result.