Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Written by Doug Lea with assistance from members of JCP JSR-166 Expert Group and released to the
* public domain, as explained at http://creativecommons.org/publicdomain/zero/1.0/
*/
package alluxio.concurrent.jsr;
import java.util.Objects;
import java.util.concurrent.CancellationException;
import java.util.concurrent.CompletionException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.locks.LockSupport;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
/**
* A {@link Future} that may be explicitly completed (setting its value and status), and may be used
* as a {@link CompletionStage}, supporting dependent functions and actions that trigger upon its
* completion.
*
*
* When two or more threads attempt to {@link #complete complete}, {@link #completeExceptionally
* completeExceptionally}, or {@link #cancel cancel} a CompletableFuture, only one of them succeeds.
*
*
* In addition to these and related methods for directly manipulating status and results,
* CompletableFuture implements interface {@link CompletionStage} with the following policies:
*
*
*
Actions supplied for dependent completions of non-async methods may be performed by
* the thread that completes the current CompletableFuture, or by any other caller of a completion
* method.
*
*
All async methods without an explicit Executor argument are performed using the
* {@link ForkJoinPool#commonPool()} (unless it does not support a parallelism level of at least
* two, in which case, a new Thread is created to run each task). This may be overridden for
* non-static methods in subclasses by defining method {@link #defaultExecutor()}. To simplify
* monitoring, debugging, and tracking, all generated asynchronous tasks are instances of the marker
* interface {@link AsynchronousCompletionTask}. Operations with time-delays can use adapter methods
* defined in this class, for example: {@code supplyAsync(supplier, delayedExecutor(timeout,
* timeUnit))}. To support methods with delays and timeouts, this class maintains at most one daemon
* thread for triggering and cancelling actions, not for running them.
*
*
All CompletionStage methods are implemented independently of other public methods, so the
* behavior of one method is not impacted by overrides of others in subclasses.
*
*
All CompletionStage methods return CompletableFutures. To restrict usages to only those
* methods defined in interface CompletionStage, use method {@link #minimalCompletionStage}. Or to
* ensure only that clients do not themselves modify a future, use method {@link #copy}.
*
*
*
* CompletableFuture also implements {@link Future} with the following policies:
*
*
*
Since (unlike {@link FutureTask}) this class has no direct control over the computation that
* causes it to be completed, cancellation is treated as just another form of exceptional
* completion. Method {@link #cancel cancel} has the same effect as
* {@code completeExceptionally(new CancellationException())}. Method
* {@link #isCompletedExceptionally} can be used to determine if a CompletableFuture completed in
* any exceptional fashion.
*
*
In case of exceptional completion with a CompletionException, methods {@link #get()} and
* {@link #get(long, TimeUnit)} throw an {@link ExecutionException} with the same cause as held in
* the corresponding CompletionException. To simplify usage in most contexts, this class also
* defines methods {@link #join()} and {@link #getNow} that instead throw the CompletionException
* directly in these cases.
*
*
*
* Arguments used to pass a completion result (that is, for parameters of type {@code T}) for
* methods accepting them may be null, but passing a null value for any other parameter will result
* in a {@link NullPointerException} being thrown.
*
*
* Subclasses of this class should normally override the "virtual constructor" method
* {@link #newIncompleteFuture}, which establishes the concrete type returned by CompletionStage
* methods. For example, here is a class that substitutes a different default Executor and disables
* the {@code obtrude} methods:
*
*
* {@code
* class MyCompletableFuture extends CompletableFuture {
* static final Executor myExecutor = ...;
* public MyCompletableFuture() { }
* public CompletableFuture newIncompleteFuture() {
* return new MyCompletableFuture(); }
* public Executor defaultExecutor() {
* return myExecutor; }
* public void obtrudeValue(T value) {
* throw new UnsupportedOperationException(); }
* public void obtrudeException(Throwable ex) {
* throw new UnsupportedOperationException(); }
* }}
*
*
* @author Doug Lea
* @param The result type returned by this future's {@code join} and {@code get} methods
* @since 1.8
*/
public class CompletableFuture implements Future, CompletionStage {
// CVS rev. 1.212
/*
* Overview:
*
* A CompletableFuture may have dependent completion actions, collected in a linked stack. It
* atomically completes by CASing a result field, and then pops off and runs those actions. This
* applies across normal vs exceptional outcomes, sync vs async actions, binary triggers, and
* various forms of completions.
*
* Non-nullness of volatile field "result" indicates done. It may be set directly if known to be
* thread-confined, else via CAS. An AltResult is used to box null as a result, as well as to hold
* exceptions. Using a single field makes completion simple to detect and trigger. Result encoding
* and decoding is straightforward but tedious and adds to the sprawl of trapping and associating
* exceptions with targets. Minor simplifications rely on (static) NIL (to box null results) being
* the only AltResult with a null exception field, so we don't usually need explicit comparisons.
* Even though some of the generics casts are unchecked (see SuppressWarnings annotations), they
* are placed to be appropriate even if checked.
*
* Dependent actions are represented by Completion objects linked as Treiber stacks headed by
* field "stack". There are Completion classes for each kind of action, grouped into: -
* single-input (UniCompletion), - two-input (BiCompletion), - projected (BiCompletions using
* exactly one of two inputs), - shared (CoCompletion, used by the second of two sources), -
* zero-input source actions, - Signallers that unblock waiters. Class Completion extends
* ForkJoinTask to enable async execution (adding no space overhead because we exploit its "tag"
* methods to maintain claims). It is also declared as Runnable to allow usage with arbitrary
* executors.
*
* Support for each kind of CompletionStage relies on a separate class, along with two
* CompletableFuture methods:
*
* * A Completion class with name X corresponding to function, prefaced with "Uni", "Bi", or "Or".
* Each class contains fields for source(s), actions, and dependent. They are boringly similar,
* differing from others only with respect to underlying functional forms. We do this so that
* users don't encounter layers of adapters in common usages.
*
* * Boolean CompletableFuture method x(...) (for example biApply) takes all of the arguments
* needed to check that an action is triggerable, and then either runs the action or arranges its
* async execution by executing its Completion argument, if present. The method returns true if
* known to be complete.
*
* * Completion method tryFire(int mode) invokes the associated x method with its held arguments,
* and on success cleans up. The mode argument allows tryFire to be called twice (SYNC, then
* ASYNC); the first to screen and trap exceptions while arranging to execute, and the second when
* called from a task. (A few classes are not used async so take slightly different forms.) The
* claim() callback suppresses function invocation if already claimed by another thread.
*
* * Some classes (for example UniApply) have separate handling code for when known to be
* thread-confined ("now" methods) and for when shared (in tryFire), for efficiency.
*
* * CompletableFuture method xStage(...) is called from a public stage method of
* CompletableFuture f. It screens user arguments and invokes and/or creates the stage object. If
* not async and already triggerable, the action is run immediately. Otherwise a Completion c is
* created, and submitted to the executor if triggerable, or pushed onto f's stack if not.
* Completion actions are started via c.tryFire. We recheck after pushing to a source future's
* stack to cover possible races if the source completes while pushing. Classes with two inputs
* (for example BiApply) deal with races across both while pushing actions. The second completion
* is a CoCompletion pointing to the first, shared so that at most one performs the action. The
* multiple-arity methods allOf does this pairwise to form trees of completions. Method anyOf is
* handled differently from allOf because completion of any source should trigger a cleanStack of
* other sources. Each AnyOf completion can reach others via a shared array.
*
* Note that the generic type parameters of methods vary according to whether "this" is a source,
* dependent, or completion.
*
* Method postComplete is called upon completion unless the target is guaranteed not to be
* observable (i.e., not yet returned or linked). Multiple threads can call postComplete, which
* atomically pops each dependent action, and tries to trigger it via method tryFire, in NESTED
* mode. Triggering can propagate recursively, so NESTED mode returns its completed dependent (if
* one exists) for further processing by its caller (see method postFire).
*
* Blocking methods get() and join() rely on Signaller Completions that wake up waiting threads.
* The mechanics are similar to Treiber stack wait-nodes used in FutureTask, Phaser, and
* SynchronousQueue. See their internal documentation for algorithmic details.
*
* Without precautions, CompletableFutures would be prone to garbage accumulation as chains of
* Completions build up, each pointing back to its sources. So we null out fields as soon as
* possible. The screening checks needed anyway harmlessly ignore null arguments that may have
* been obtained during races with threads nulling out fields. We also try to unlink non-isLive
* (fired or cancelled) Completions from stacks that might otherwise never be popped: Method
* cleanStack always unlinks non isLive completions from the head of stack; others may
* occasionally remain if racing with other cancellations or removals.
*
* Completion fields need not be declared as final or volatile because they are only visible to
* other threads upon safe publication.
*/
/** The encoding of the null value. */
static final AltResult NIL = new AltResult(null);
// Modes for Completion.tryFire. Signedness matters.
static final int SYNC = 0;
static final int ASYNC = 1;
static final int NESTED = -1;
private static final boolean USE_COMMON_POOL = (ForkJoinPool.getCommonPoolParallelism() > 1);
/**
* Default executor -- ForkJoinPool.commonPool() unless it cannot support parallelism.
*/
private static final Executor ASYNC_POOL =
USE_COMMON_POOL ? ForkJoinPool.commonPool() : new ThreadPerTaskExecutor();
/* ------------- Encoding and decoding outcomes -------------- */
// Unsafe mechanics
private static final sun.misc.Unsafe U = UnsafeAccess.unsafe;
private static final long RESULT;
private static final long STACK;
private static final long NEXT;
static {
try {
RESULT = U.objectFieldOffset(CompletableFuture.class.getDeclaredField("result"));
STACK = U.objectFieldOffset(CompletableFuture.class.getDeclaredField("stack"));
NEXT = U.objectFieldOffset(Completion.class.getDeclaredField("next"));
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
// Reduce the risk of rare disastrous classloading in first call to
// LockSupport.park: https://bugs.openjdk.java.net/browse/JDK-8074773
@SuppressWarnings("unused")
Class> ensureLoaded = LockSupport.class;
}
volatile Object result; // Either the result or boxed AltResult
volatile Completion stack; // Top of Treiber stack of dependent actions
/**
* Creates a new incomplete CompletableFuture.
*/
public CompletableFuture() {}
/**
* Creates a new complete CompletableFuture with given encoded result.
*/
CompletableFuture(Object r) {
this.result = r;
}
/**
* Returns the encoding of the given (non-null) exception as a wrapped CompletionException unless
* it is one already.
*/
static AltResult encodeThrowable(Throwable x) {
return new AltResult((x instanceof CompletionException) ? x : new CompletionException(x));
}
/**
* Returns the encoding of the given (non-null) exception as a wrapped CompletionException unless
* it is one already. May return the given Object r (which must have been the result of a source
* future) if it is equivalent, i.e. if this is a simple relay of an existing CompletionException.
*/
static Object encodeThrowable(Throwable x, Object r) {
if (!(x instanceof CompletionException))
x = new CompletionException(x);
else if (r instanceof AltResult && x == ((AltResult) r).ex)
return r;
return new AltResult(x);
}
/**
* Returns the encoding of a copied outcome; if exceptional, rewraps as a CompletionException,
* else returns argument.
*/
static Object encodeRelay(Object r) {
Throwable x;
if (r instanceof AltResult && (x = ((AltResult) r).ex) != null
&& !(x instanceof CompletionException))
r = new AltResult(new CompletionException(x));
return r;
}
/**
* Reports result using Future.get conventions.
*/
private static Object reportGet(Object r) throws InterruptedException, ExecutionException {
if (r == null) // by convention below, null means interrupted
throw new InterruptedException();
if (r instanceof AltResult) {
Throwable x, cause;
if ((x = ((AltResult) r).ex) == null)
return null;
if (x instanceof CancellationException)
throw (CancellationException) x;
if ((x instanceof CompletionException) && (cause = x.getCause()) != null)
x = cause;
throw new ExecutionException(x);
}
return r;
}
/**
* Decodes outcome to return result or throw unchecked exception.
*/
private static Object reportJoin(Object r) {
if (r instanceof AltResult) {
Throwable x;
if ((x = ((AltResult) r).ex) == null)
return null;
if (x instanceof CancellationException)
throw (CancellationException) x;
if (x instanceof CompletionException)
throw (CompletionException) x;
throw new CompletionException(x);
}
return r;
}
/* ------------- Async task preliminaries -------------- */
/**
* Null-checks user executor argument, and translates uses of commonPool to ASYNC_POOL in case
* parallelism disabled.
*/
static Executor screenExecutor(Executor e) {
if (!USE_COMMON_POOL && e == ForkJoinPool.commonPool())
return ASYNC_POOL;
return Objects.requireNonNull(e);
}
static void lazySetNext(Completion c, Completion next) {
U.putOrderedObject(c, NEXT, next);
}
static boolean casNext(Completion c, Completion cmp, Completion val) {
return U.compareAndSwapObject(c, NEXT, cmp, val);
}
private static CompletableFuture uniCopyStage(CompletableFuture src) {
Object r;
CompletableFuture d = src.newIncompleteFuture();
if ((r = src.result) != null)
d.result = encodeRelay(r);
else
src.unipush(new UniRelay(d, src));
return d;
}
/** Recursively constructs a tree of completions. */
static CompletableFuture andTree(CompletableFuture>[] cfs, int lo, int hi) {
CompletableFuture d = new CompletableFuture();
if (lo > hi) // empty
d.result = NIL;
else {
CompletableFuture> a, b;
Object r, s, z;
Throwable x;
int mid = (lo + hi) >>> 1;
if ((a = (lo == mid ? cfs[lo] : andTree(cfs, lo, mid))) == null
|| (b = (lo == hi ? a : (hi == mid + 1) ? cfs[hi] : andTree(cfs, mid + 1, hi))) == null)
throw new NullPointerException();
if ((r = a.result) == null || (s = b.result) == null)
a.bipush(b, new BiRelay(d, a, b));
else if ((r instanceof AltResult && (x = ((AltResult) (z = r)).ex) != null)
|| (s instanceof AltResult && (x = ((AltResult) (z = s)).ex) != null))
d.result = encodeThrowable(x, z);
else
d.result = NIL;
}
return d;
}
static CompletableFuture asyncSupplyStage(Executor e, Supplier f) {
Objects.requireNonNull(f);
CompletableFuture d = new CompletableFuture();
e.execute(new AsyncSupply(d, f));
return d;
}
static CompletableFuture asyncRunStage(Executor e, Runnable f) {
Objects.requireNonNull(f);
CompletableFuture d = new CompletableFuture();
e.execute(new AsyncRun(d, f));
return d;
}
/**
* Returns a new CompletableFuture that is asynchronously completed by a task running in the
* {@link ForkJoinPool#commonPool()} with the value obtained by calling the given Supplier.
*
* @param supplier a function returning the value to be used to complete the returned
* CompletableFuture
* @param the function's return type
* @return the new CompletableFuture
*/
public static CompletableFuture supplyAsync(Supplier supplier) {
return asyncSupplyStage(ASYNC_POOL, supplier);
}
/* ------------- Base Completion classes and operations -------------- */
/**
* Returns a new CompletableFuture that is asynchronously completed by a task running in the given
* executor with the value obtained by calling the given Supplier.
*
* @param supplier a function returning the value to be used to complete the returned
* CompletableFuture
* @param executor the executor to use for asynchronous execution
* @param the function's return type
* @return the new CompletableFuture
*/
public static CompletableFuture supplyAsync(Supplier supplier, Executor executor) {
return asyncSupplyStage(screenExecutor(executor), supplier);
}
/**
* Returns a new CompletableFuture that is asynchronously completed by a task running in the
* {@link ForkJoinPool#commonPool()} after it runs the given action.
*
* @param runnable the action to run before completing the returned CompletableFuture
* @return the new CompletableFuture
*/
public static CompletableFuture runAsync(Runnable runnable) {
return asyncRunStage(ASYNC_POOL, runnable);
}
/**
* Returns a new CompletableFuture that is asynchronously completed by a task running in the given
* executor after it runs the given action.
*
* @param runnable the action to run before completing the returned CompletableFuture
* @param executor the executor to use for asynchronous execution
* @return the new CompletableFuture
*/
public static CompletableFuture runAsync(Runnable runnable, Executor executor) {
return asyncRunStage(screenExecutor(executor), runnable);
}
/**
* Returns a new CompletableFuture that is already completed with the given value.
*
* @param value the value
* @param the type of the value
* @return the completed CompletableFuture
*/
public static CompletableFuture completedFuture(U value) {
return new CompletableFuture((value == null) ? NIL : value);
}
/**
* Returns a new CompletableFuture that is completed when all of the given CompletableFutures
* complete. If any of the given CompletableFutures complete exceptionally, then the returned
* CompletableFuture also does so, with a CompletionException holding this exception as its cause.
* Otherwise, the results, if any, of the given CompletableFutures are not reflected in the
* returned CompletableFuture, but may be obtained by inspecting them individually. If no
* CompletableFutures are provided, returns a CompletableFuture completed with the value
* {@code null}.
*
*
* Among the applications of this method is to await completion of a set of independent
* CompletableFutures before continuing a program, as in: {@code CompletableFuture.allOf(c1, c2,
* c3).join();}.
*
* @param cfs the CompletableFutures
* @return a new CompletableFuture that is completed when all of the given CompletableFutures
* complete
* @throws NullPointerException if the array or any of its elements are {@code null}
*/
public static CompletableFuture allOf(CompletableFuture>... cfs) {
return andTree(cfs, 0, cfs.length - 1);
}
/* ------------- One-input Completions -------------- */
/**
* Returns a new CompletableFuture that is completed when any of the given CompletableFutures
* complete, with the same result. Otherwise, if it completed exceptionally, the returned
* CompletableFuture also does so, with a CompletionException holding this exception as its cause.
* If no CompletableFutures are provided, returns an incomplete CompletableFuture.
*
* @param cfs the CompletableFutures
* @return a new CompletableFuture that is completed with the result or exception of any of the
* given CompletableFutures when one completes
* @throws NullPointerException if the array or any of its elements are {@code null}
*/
public static CompletableFuture