Top Description Inners Fields Constructors Methods
java.util.concurrent

public abstract Class ForkJoinTask<V>

extends Object
implements Future<V>, Serializable
Class Inheritance
All Implemented Interfaces
java.io.Serializable, java.util.concurrent.Future
Known Direct Subclasses
java.util.concurrent.ForkJoinTask.AdaptedRunnable, java.util.concurrent.ForkJoinTask.AdaptedRunnableAction, java.util.concurrent.ForkJoinTask.AdaptedCallable, java.util.concurrent.ForkJoinTask.InterruptibleTask, java.util.concurrent.RecursiveAction, java.util.concurrent.RecursiveTask, java.util.concurrent.SubmissionPublisher.ConsumerTask, java.util.concurrent.CompletableFuture.Completion, java.util.concurrent.CompletableFuture.AsyncSupply, java.util.concurrent.CompletableFuture.AsyncRun, java.util.concurrent.CountedCompleter
Type Parameters
<V>
the type of the result of the task
Imports
java.io.Serializable, java.lang.reflect.Constructor, java.util.Collection, .List, .Objects, .RandomAccess, java.util.concurrent.locks.LockSupport, jdk.internal.misc.Unsafe

Abstract base class for tasks that run within a ForkJoinPool. A ForkJoinTask is a thread-like entity that is much lighter weight than a normal thread. Huge numbers of tasks and subtasks may be hosted by a small number of actual threads in a ForkJoinPool, at the price of some usage limitations.

A "main" ForkJoinTask begins execution when it is explicitly submitted to a ForkJoinPool, or, if not already engaged in a ForkJoin computation, commenced in the ForkJoinPool#commonPool() via fork, invoke, or related methods. Once started, it will usually in turn start other subtasks. As indicated by the name of this class, many programs using ForkJoinTask employ only methods fork and join, or derivatives such as invokeAll. However, this class also provides a number of other methods that can come into play in advanced usages, as well as extension mechanics that allow support of new forms of fork/join processing.

A ForkJoinTask is a lightweight form of Future. The efficiency of ForkJoinTasks stems from a set of restrictions (that are only partially statically enforceable) reflecting their main use as computational tasks calculating pure functions or operating on purely isolated objects. The primary coordination mechanisms are fork, that arranges asynchronous execution, and join, that doesn't proceed until the task's result has been computed. Computations should ideally avoid synchronized methods or blocks, and should minimize other blocking synchronization apart from joining other tasks or using synchronizers such as Phasers that are advertised to cooperate with fork/join scheduling. Subdividable tasks should also not perform blocking I/O, and should ideally access variables that are completely independent of those accessed by other running tasks. These guidelines are loosely enforced by not permitting checked exceptions such as IOExceptions to be thrown. However, computations may still encounter unchecked exceptions, that are rethrown to callers attempting to join them. These exceptions may additionally include RejectedExecutionException stemming from internal resource exhaustion, such as failure to allocate internal task queues. Rethrown exceptions behave in the same way as regular exceptions, but, when possible, contain stack traces (as displayed for example using ex.printStackTrace()) of both the thread that initiated the computation as well as the thread actually encountering the exception; minimally only the latter.

It is possible to define and use ForkJoinTasks that may block, but doing so requires three further considerations: (1) Completion of few if any other tasks should be dependent on a task that blocks on external synchronization or I/O. Event-style async tasks that are never joined (for example, those subclassing CountedCompleter) often fall into this category. (2) To minimize resource impact, tasks should be small; ideally performing only the (possibly) blocking action. (3) Unless the ForkJoinPool.ManagedBlocker API is used, or the number of possibly blocked tasks is known to be less than the pool's ForkJoinPool#getParallelism level, the pool cannot guarantee that enough threads will be available to ensure progress or good performance.

The primary method for awaiting completion and extracting results of a task is join, but there are several variants: The Future#get methods support interruptible and/or timed waits for completion and report results using Future conventions. Method invoke is semantically equivalent to fork(); join() but always attempts to begin execution in the current thread. The "quiet" forms of these methods do not extract results or report exceptions. These may be useful when a set of tasks are being executed, and you need to delay processing of results or exceptions until all complete. Method invokeAll (available in multiple versions) performs the most common form of parallel invocation: forking a set of tasks and joining them all.

In the most typical usages, a fork-join pair act like a call (fork) and return (join) from a parallel recursive function. As is the case with other forms of recursive calls, returns (joins) should be performed innermost-first. For example, a.fork(); b.fork(); b.join(); a.join(); is likely to be substantially more efficient than joining a before b.

The execution status of tasks may be queried at several levels of detail: isDone is true if a task completed in any way (including the case where a task was cancelled without executing); isCompletedNormally is true if a task completed without cancellation or encountering an exception; isCancelled is true if the task was cancelled (in which case getException returns a CancellationException); and isCompletedAbnormally is true if a task was either cancelled or encountered an exception, in which case getException will return either the encountered exception or CancellationException.

The ForkJoinTask class is not usually directly subclassed. Instead, you subclass one of the abstract classes that support a particular style of fork/join processing, typically RecursiveAction for most computations that do not return results, RecursiveTask for those that do, and CountedCompleter for those in which completed actions trigger other actions. Normally, a concrete ForkJoinTask subclass declares fields comprising its parameters, established in a constructor, and then defines a compute method that somehow uses the control methods supplied by this base class.

Method join and its variants are appropriate for use only when completion dependencies are acyclic; that is, the parallel computation can be described as a directed acyclic graph (DAG). Otherwise, executions may encounter a form of deadlock as tasks cyclically wait for each other. However, this framework supports other methods and techniques (for example the use of Phaser, helpQuiesce, and complete) that may be of use in constructing custom subclasses for problems that are not statically structured as DAGs. To support such usages, a ForkJoinTask may be atomically tagged with a short value using setForkJoinTaskTag or compareAndSetForkJoinTaskTag and checked using getForkJoinTaskTag. The ForkJoinTask implementation does not use these protected methods or tags for any purpose, but they may be of use in the construction of specialized subclasses. For example, parallel graph traversals can use the supplied methods to avoid revisiting nodes/tasks that have already been processed. (Method names for tagging are bulky in part to encourage definition of methods that reflect their usage patterns.)

Most base support methods are final, to prevent overriding of implementations that are intrinsically tied to the underlying lightweight task scheduling framework. Developers creating new basic styles of fork/join processing should minimally implement protected methods exec, setRawResult, and getRawResult, while also introducing an abstract computational method that can be implemented in its subclasses, possibly relying on other protected methods provided by this class.

ForkJoinTasks should perform relatively small amounts of computation. Large tasks should be split into smaller subtasks, usually via recursive decomposition. As a very rough rule of thumb, a task should perform more than 100 and less than 10000 basic computational steps, and should avoid indefinite looping. If tasks are too big, then parallelism cannot improve throughput. If too small, then memory and internal task maintenance overhead may overwhelm processing.

This class provides adapt methods for Runnable and Callable, that may be of use when mixing execution of ForkJoinTasks with other kinds of tasks. When all tasks are of this form, consider using a pool constructed in asyncMode.

ForkJoinTasks are Serializable, which enables them to be used in extensions such as remote execution frameworks. It is sensible to serialize tasks only before or after, but not during, execution. Serialization is not relied on during execution itself.

Author
Doug Lea
Since
1.7

Nested and Inner Type Summary

Modifier and TypeClass and Description
pack-priv static class
ForkJoinTask.AdaptedCallable<T>

Adapter for Callables.

pack-priv static class
ForkJoinTask.AdaptedInterruptibleCallable<T>

Adapter for Callable-based interruptible tasks.

pack-priv static class
ForkJoinTask.AdaptedInterruptibleRunnable<T>

Adapter for Runnable-based interruptible tasks.

pack-priv static class
ForkJoinTask.AdaptedRunnable<T>

Adapter for Runnables.

pack-priv static class
ForkJoinTask.AdaptedRunnableAction

Adapter for Runnables without results.

pack-priv static class
ForkJoinTask.Aux

Nodes for threads waiting for completion, or holding a thrown exception (never both).

pack-priv abstract static class
ForkJoinTask.InterruptibleTask<T>

Tasks with semantics conforming to ExecutorService conventions.

pack-priv static class
ForkJoinTask.InvokeAnyRoot<T>

Task (that is never forked) to hold results for ForkJoinPool.invokeAny, or to report exception if all subtasks fail or are cancelled or the pool is terminating.

pack-priv static class
ForkJoinTask.InvokeAnyTask<T>

Task with results in InvokeAnyRoot (and never independently joined).

pack-priv static class
ForkJoinTask.RunnableExecuteAction

Adapter for Runnables in which failure forces worker exception.

Field Summary

Modifier and TypeField and Description
pack-priv static final int
private transient volatile ForkJoinTask.Aux
private static final long
pack-priv static final int
pack-priv static final int
pack-priv static final int
private static final long
pack-priv static final int
pack-priv volatile int
private static final long
pack-priv static final int
private static final Unsafe
U

pack-priv static final int

Constructor Summary

AccessConstructor and Description
public
ForkJoinTask()

Constructor for subclasses to call.

Method Summary

Modifier and TypeMethod and Description
public static ForkJoinTask<?>

Returns:

the task
adapt
(Runnable
the runnable action
runnable
)

Returns a new ForkJoinTask that performs the run method of the given Runnable as its action, and returns a null result upon join.

public static <
the type of the result
T
>
ForkJoinTask<T>

Returns:

the task
adapt
(Runnable
the runnable action
runnable
,
T
the result upon completion
result
)

Returns a new ForkJoinTask that performs the run method of the given Runnable as its action, and returns the given result upon join.

public static <
the type of the callable's result
T
>
ForkJoinTask<T>

Returns:

the task
adapt
(Callable<? extends T>
the callable action
callable
)

Returns a new ForkJoinTask that performs the call method of the given Callable as its action, and returns its result upon join, translating any checked exceptions encountered into RuntimeException.

public static <
the type of the callable's result
T
>
ForkJoinTask<T>

Returns:

the task
adaptInterruptible
(Callable<? extends T>
the callable action
callable
)

Returns a new ForkJoinTask that performs the call method of the given Callable as its action, and returns its result upon join, translating any checked exceptions encountered into RuntimeException.

public static <
the type of the result
T
>
ForkJoinTask<T>

Returns:

the task
adaptInterruptible
(Runnable
the runnable action
runnable
,
T
the result upon completion
result
)

Returns a new ForkJoinTask that performs the run method of the given Runnable as its action, and returns the given result upon join, translating any checked exceptions encountered into RuntimeException.

public static ForkJoinTask<?>

Returns:

the task
adaptInterruptible
(Runnable
the runnable action
runnable
)

Returns a new ForkJoinTask that performs the run method of the given Runnable as its action, and returns null upon join, translating any checked exceptions encountered into RuntimeException.

private int
awaitDone(ForkJoinPool pool, int compensation, boolean interruptible, long deadline)

private int

Returns:

ABNORMAL if interrupted, else status on exit
awaitDone
(boolean
if wait is interruptible
interruptible
,
long
if nonzero, timeout deadline
deadline
)

Tries applicable helping steps while joining this task, otherwise invokes blocking version of awaitDone.

public boolean

Returns:

true if this task is now cancelled
cancel
(boolean
this value has no effect in the default implementation because interrupts are not used to control cancellation.
mayInterruptIfRunning
)

Implements java.util.concurrent.Future.cancel.

Attempts to cancel execution of this task.

private boolean
private boolean
casStatus(int c, int v)

private ForkJoinTask.Aux
public final boolean

Returns:

true if successful; i.e., the current value was equal to expect and was changed to update.
compareAndSetForkJoinTaskTag
(short
the expected tag value
expect
,
short
the new tag value
update
)

Atomically conditionally sets the tag value for this task.

public void
complete(V
the result value for this task
value
)

Completes this task, and if not already aborted or cancelled, returning the given value as the result of subsequent invocations of join and related operations.

public void
completeExceptionally(Throwable
the exception to throw. If this exception is not a RuntimeException or Error, the actual exception thrown will be a RuntimeException with cause ex.
ex
)

Completes this task abnormally, and if not already aborted or cancelled, causes it to throw the given exception upon join and related operations.

pack-priv final void
doExec()

Runs a task body: Unless done, calls exec and records status if completed, but doesn't wait for completion otherwise.

public Throwable
exceptionNow()

Overrides default java.util.concurrent.Future.exceptionNow.

Returns the exception thrown by the task, without waiting.

protected abstract boolean

Returns:

true if this task is known to have completed normally
exec
()

Immediately performs the base action of this task and returns true if, upon return from this method, this task is guaranteed to have completed.

public final ForkJoinTask<V>

Returns:

this, to simplify usage
fork
()

Arranges to asynchronously execute this task in the pool the current task is running in, if applicable, or using the ForkJoinPool#commonPool() if not inForkJoinPool.

public final V

Returns:

the computed result
get
()

Implements java.util.concurrent.Future.get.

Waits if necessary for the computation to complete, and then retrieves its result.

public final V

Returns:

the computed result
get
(long
the maximum time to wait
timeout
,
TimeUnit
the time unit of the timeout argument
unit
)

Implements java.util.concurrent.Future.get.

Waits if necessary for at most the given time for the computation to complete, and then retrieves its result, if available.

private int
private Throwable

Returns:

the exception, or null if none
getException
(boolean
true if wrap as ExecutionException
asExecutionException
)

Returns a rethrowable exception for this task, if available.

public final Throwable

Returns:

the exception, or null if none
getException
()

Returns the exception thrown by the base computation, or a CancellationException if cancelled, or null if none or if the method has not yet completed.

pack-priv final int
getForkJoinTaskStatusMarkerBit()

Returns nonzero if MARKER bit set.

public final short

Returns:

the tag for this task
getForkJoinTaskTag
()

Returns the tag for this task.

public static ForkJoinPool

Returns:

the pool, or null if none
getPool
()

Returns the pool hosting the current thread, or null if the current thread is executing outside of any ForkJoinPool.

public static int

Returns:

the number of tasks
getQueuedTaskCount
()

Returns an estimate of the number of tasks that have been forked by the current worker thread but not yet executed.

public abstract V

Returns:

the result, or null if not completed
getRawResult
()

Returns the result that would be returned by join, even if this task completed abnormally, or null if this task is not known to have been completed.

public static int

Returns:

the surplus number of tasks, which may be negative
getSurplusQueuedTaskCount
()

Returns an estimate of how many more locally queued tasks are held by the current worker thread than there are other worker threads that might steal them, or zero if this thread is not operating in a ForkJoinPool.

public static void
helpQuiesce()

Possibly executes tasks until the pool hosting the current task is quiescent.

public static boolean

Returns:

true if the current thread is a ForkJoinWorkerThread executing as a ForkJoinPool computation, or false otherwise
inForkJoinPool
()

Returns true if the current thread is a ForkJoinWorkerThread executing as a ForkJoinPool computation.

public final V

Returns:

the computed result
invoke
()

Commences performing this task, awaits its completion if necessary, and returns its result, or throws an (unchecked) RuntimeException or Error if the underlying computation did so.

public static void
invokeAll(ForkJoinTask<?>
the first task
t1
,
ForkJoinTask<?>
the second task
t2
)

Forks the given tasks, returning when isDone holds for each task or an (unchecked) exception is encountered, in which case the exception is rethrown.

public static void
invokeAll(ForkJoinTask<?>...
the tasks
tasks
)

Forks the given tasks, returning when isDone holds for each task or an (unchecked) exception is encountered, in which case the exception is rethrown.

public static <
the type of the values returned from the tasks
T extends ForkJoinTask<?>
>
Collection<T>

Returns:

the tasks argument, to simplify usage
invokeAll
(Collection<T>
the collection of tasks
tasks
)

Forks all tasks in the specified collection, returning when isDone holds for each task or an (unchecked) exception is encountered, in which case the exception is rethrown.

public final boolean
isCancelled()

Implements java.util.concurrent.Future.isCancelled.

Returns true if this task was cancelled before it completed normally.

public final boolean

Returns:

true if this task threw an exception or was cancelled
isCompletedAbnormally
()

Returns true if this task threw an exception or was cancelled.

public final boolean

Returns:

true if this task completed without throwing an exception and was not cancelled
isCompletedNormally
()

Returns true if this task completed without throwing an exception and was not cancelled.

public final boolean
isDone()

Implements java.util.concurrent.Future.isDone.

Returns true if this task completed.

public final V

Returns:

the computed result
join
()

Returns the result of the computation when it is done.

pack-priv void
onAuxExceptionSet(Throwable ex)

Overridable action on setting exception

protected static ForkJoinTask<?>

Returns:

the next task, or null if none are available
peekNextLocalTask
()

Returns, but does not unschedule or execute, a task queued by the current thread but not yet executed, if one is immediately available.

protected static ForkJoinTask<?>

Returns:

the next task, or null if none are available
pollNextLocalTask
()

Unschedules and returns, without executing, the next task queued by the current thread but not yet executed, if the current thread is operating in a ForkJoinPool.

protected static ForkJoinTask<?>

Returns:

a task, or null if none are available
pollSubmission
()

If the current thread is operating in a ForkJoinPool, unschedules and returns, without executing, a task externally submitted to the pool, if one is available.

protected static ForkJoinTask<?>

Returns:

a task, or null if none are available
pollTask
()

If the current thread is operating in a ForkJoinPool, unschedules and returns, without executing, the next task queued by the current thread but not yet executed, if one is available, or if not available, a task that was forked by some other thread, if available.

public final void
quietlyComplete()

Completes this task normally without setting a value.

public final void
quietlyInvoke()

Commences performing this task and awaits its completion if necessary, without returning its result or throwing its exception.

public final void
quietlyJoin()

Joins this task, without returning its result or throwing its exception.

public final boolean

Returns:

true if this task completed
quietlyJoin
(long
the maximum time to wait
timeout
,
TimeUnit
the time unit of the timeout argument
unit
)

Tries to join this task, returning true if it completed (possibly exceptionally) before the given timeout and the current thread has not been interrupted.

pack-priv final void
quietlyJoinPoolInvokeAllTask(long deadline)

Utility for possibly-timed ForkJoinPool.invokeAll

public final boolean

Returns:

true if this task completed
quietlyJoinUninterruptibly
(long
the maximum time to wait
timeout
,
TimeUnit
the time unit of the timeout argument
unit
)

Tries to join this task, returning true if it completed (possibly exceptionally) before the given timeout.

private void
readObject(ObjectInputStream
the stream
s
)

Reconstitutes this task from a stream (that is, deserializes it).

public void
reinitialize()

Resets the internal bookkeeping state of this task, allowing a subsequent fork.

private void
reportException(boolean asExecutionException)

Throws thrown exception, or CancellationException if none recorded.

public V
resultNow()

Overrides default java.util.concurrent.Future.resultNow.

Returns the computed result, without waiting.

pack-priv static void
rethrow(Throwable ex)

A version of "sneaky throw" to relay exceptions in other contexts.

private void
setDone()

Sets DONE status and wakes up threads waiting to join this task.

pack-priv final int
setForkJoinTaskStatusMarkerBit()

Sets MARKER bit, returning nonzero if previously set

public final short

Returns:

the previous value of the tag
setForkJoinTaskTag
(short
the new tag value
newValue
)

Atomically sets the tag value for this task and returns the old value.

protected abstract void
setRawResult(V
the value
value
)

Forces the given value to be returned as a result.

private void
signalWaiters()

Removes and unparks waiters

public Future.State
state()

Overrides default java.util.concurrent.Future.state.

Returns the computation state.

pack-priv final int

Returns:

previous status
trySetCancelled
()

Sets ABNORMAL DONE status unless already done, and wakes up threads waiting to join this task.

pack-priv final void
trySetException(Throwable ex)

Tries to set exception, if so invoking onAuxExceptionSet

pack-priv final boolean

Returns:

true if set
trySetThrown
(Throwable ex)

Records exception and sets ABNORMAL THROWN DONE status unless already done, and wakes up threads waiting to join this task.

public boolean

Returns:

true if unforked
tryUnfork
()

Tries to unschedule this task for execution.

pack-priv static <T extends Throwable> void
uncheckedThrow(Throwable t)

The sneaky part of sneaky throw, relying on generics limitations to evade compiler complaints about rethrowing unchecked exceptions.

private void
writeObject(ObjectOutputStream
the stream
s
)

Saves this task to a stream (that is, serializes it).

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait