public void done(Callable callable) {
   isDone.set(true);
   if (reaperFuture != null) {
     reaperFuture.cancel(true);
   }
   super.done();
 }
 public boolean cancel(boolean mayInterruptIfRunning) {
   if (!cancelled.get() && innerFuture != null) {
     method.abort();
     try {
       asyncHandler.onThrowable(new CancellationException());
     } catch (Throwable t) {
       logger.debug("asyncHandler.onThrowable", t);
     }
     cancelled.set(true);
     if (reaperFuture != null) {
       reaperFuture.cancel(true);
     }
     super.done();
     return innerFuture.cancel(mayInterruptIfRunning);
   } else {
     super.done();
     return false;
   }
 }
  public void abort(Throwable t) {
    if (innerFuture != null) {
      innerFuture.cancel(true);
    }

    if (method != null) {
      method.abort();
    }

    if (reaperFuture != null) {
      reaperFuture.cancel(true);
    }

    exception.set(t);
    if (!timedOut.get() && !cancelled.get()) {
      try {
        asyncHandler.onThrowable(t);
      } catch (Throwable t2) {
        logger.debug("asyncHandler.onThrowable", t2);
      }
    }
    super.done();
  }