guava/src/com/google/common/util/concurrent/AbstractFuture.java
@CanIgnoreReturnValue
  protected boolean setException(Throwable throwable) {
    Object valueToSet = new Failure(checkNotNull(throwable));
    if (ATOMIC_HELPER.casValue(this, null, valueToSet)) {
      complete(this);
      return true;
    }
    return false;
  }
@CanIgnoreReturnValue
  protected boolean setException(Throwable throwable) {
    Object valueToSet = new Failure(checkNotNull(throwable));
    if (ATOMIC_HELPER.casValue(this, null, valueToSet)) {
      complete(this);
      return true;
    }
    return false;
  }
Sets the failed result of this {@code Future} unless this {@code Future} has already been
cancelled or set (including {@linkplain #setFuture set asynchronously}). When a call to this
method returns, the {@code Future} is guaranteed to be {@linkplain #isDone done} <b>only if</b>
the call was accepted (in which case it returns {@code true}). If it returns {@code false}, the
{@code Future} may have previously been set asynchronously, in which case its result may not be
known yet. That result, though not yet known, cannot be overridden by a call to a {@code set*}
method, only by a call to {@link #cancel}.

@param throwable the exception to be used as the failed result
@return true if the attempt was accepted, completing the {@code Future}