code: public static UploadMonitor create(
              TransferManager manager,
              UploadImpl transfer,
              ExecutorService threadPool,
              UploadCallable multipartUploadCallable,
              PutObjectRequest putObjectRequest,
              ProgressListenerChain progressListenerChain) {
  
          UploadMonitor uploadMonitor = new UploadMonitor(manager, transfer,
                  threadPool, multipartUploadCallable, putObjectRequest,
                  progressListenerChain);
          Future<UploadResult> thisFuture = threadPool.submit(uploadMonitor);
          // Use an atomic compareAndSet to prevent a possible race between the
          // setting of the UploadMonitor's futureReference, and setting the
          // CompleteMultipartUpload's futureReference within the call() method.
          // We only want to set the futureReference to UploadMonitor's futureReference if the
          // current value is null, otherwise the futureReference that's set is
          // CompleteMultipartUpload's which is ultimately what we want.
          uploadMonitor.futureReference.compareAndSet(null, thisFuture);
          return uploadMonitor;
      }
docs: Constructs a new upload watcher and then immediately submits it to
  the thread pool.
  
  @param manager
  The {@link TransferManager} that owns this upload.
  @param transfer
  The transfer being processed.
  @param threadPool
  The {@link ExecutorService} to which we should submit new
  tasks.
  @param multipartUploadCallable
  The callable responsible for processing the upload
  asynchronously
  @param putObjectRequest
  The original putObject request
  @param progressListenerChain
  A chain of listeners that wish to be notified of upload
  progress