public abstract class ForkJoinTask
extends Object
implements Future<V>, Serializable
java.lang.Object | |
↳ | java.util.concurrent.ForkJoinTask<V> |
Known Direct Subclasses |
在ForkJoinPool
内运行的任务的抽象基类。 A ForkJoinTask
是一个类似线程的实体,比普通线程轻得多。 大量的任务和子任务可能由一些使用限制的代价在ForkJoinPool中由少量实际线程托管。
A“主” ForkJoinTask
开始执行时,明确提出到ForkJoinPool
,或者,如果不是已经从事ForkJoin计算,在开始commonPool()
通过fork()
, invoke()
,或相关方法。 一旦开始,它通常会开始启动其他子任务。 如该类别的名称所示,许多使用ForkJoinTask
程序ForkJoinTask
使用方法fork()
和join()
或诸如invokeAll
衍生物。 然而,这个类还提供了许多其他方法,可以在高级用法中使用,以及允许支持新形式的fork / join处理的扩展机制。
A ForkJoinTask
是一种轻量级的Future
。 ForkJoinTask
的效率源于一系列限制(仅部分是静态可执行的),反映它们主要用作计算纯函数或在纯孤立对象上运行的计算任务。 主要的协调机制是fork()
,它安排异步执行和join()
,直到任务的结果被计算出才会继续执行。 理想情况下,计算应避免synchronized
方法或块,并且应尽量减少除加入其他任务或使用同步器(例如通告与fork / join调度协作的相位器)之外的其他阻塞同步。 可细分的任务也不应该执行阻塞I / O,理想情况下应该访问完全独立于其他正在运行的任务访问的变量。 由于不允许检查异常(如IOExceptions
被抛出, IOExceptions
这些准则被宽松地强制执行。 但是,计算仍可能会遇到未检查的异常,这些异常会重新尝试加入到调用者中。 这些异常还可能包括源于内部资源耗尽的RejectedExecutionException
,例如未能分配内部任务队列。 突发异常的行为与常规异常相同,但在可能的情况下,包含启动计算的线程以及实际遇到异常的线程的堆栈跟踪(例如,使用ex.printStackTrace()
显示); 最低限度只有后者。
可以定义和使用可能阻塞的ForkJoinTasks,但这样做需要进一步考虑三个因素:(1)完成很少的任何其他任务应该依赖于阻塞外部同步或I / O的任务。 永远不会加入的事件式异步任务(例如,那些CountedCompleter
子CountedCompleter
)通常属于此类别。 (2)为尽量减少资源的影响,任务应小; 理想情况下只执行(可能)阻止操作。 (3)除非使用ForkJoinPool.ManagedBlocker
API,否则可能阻塞的任务的数量已知小于池的getParallelism()
级别, getParallelism()
池不能保证有足够的线程可用来确保进度或良好的性能。
等待完成并提取任务结果的主要方法是join()
,但有几种变体: get()
方法支持可中断和/或定时等待完成并使用Future
约定报告结果。 方法invoke()
在语义上等同于fork(); join()
但始终尝试在当前线程中开始执行。 这些方法的“ 安静 ”形式不会提取结果或报告异常。 当一组任务正在执行时,这些可能很有用,并且需要延迟处理结果或异常,直到全部完成。 方法invokeAll
(可用于多个版本)执行最常见的并行调用形式:分派一组任务并将它们全部加入。
在最典型的用法中,fork-join对像一个调用(fork),并且从并行递归函数返回(join)。 与其他形式的递归调用一样,返回(连接)应该以内部优先执行。 例如, a.fork(); b.fork(); b.join(); a.join();
很可能是显着大于接合更有效a
之前b
。
任务的执行状态可以在几个细节级别上查询: isDone()
如果以任何方式完成任务(包括任务被取消而未执行的情况),则为真; isCompletedNormally()
如果任务完成而没有取消或遇到异常,则为true; isCancelled()
如果任务被取消(在这种情况下, getException()
返回CancellationException
) CancellationException
; 和isCompletedAbnormally()
如果任务被取消或遇到异常,则为真,在这种情况下, getException()
将返回遇到的异常或CancellationException
。
ForkJoinTask类通常不直接进行子类化。 相反,你继承了支持叉的特定风格/连接处理,通常是抽象类的一个RecursiveAction
对于不返回结果大多数计算, RecursiveTask
对于那些做的, CountedCompleter
对于那些在已完成的操作触发其它动作。 通常情况下,一个具体的子类ForkJoinTask声明字段,其包括它的参数,建立在一个构造,然后限定了compute
以某种方式使用由这个基类提供的控制方法的方法。
方法join()
及其变体仅适用于完成依赖关系是非循环的; 也就是说,并行计算可以描述为有向无环图(DAG)。 否则,执行可能会遇到一种形式的死锁,因为任务会周期性地等待对方。 然而,该框架支持的其它方法和技术(例如使用Phaser
, helpQuiesce()
和complete(V)
),其可以使用在构建定制子类为没有静态构造为DAG的问题。 为了支持这种用法,可以使用setForkJoinTaskTag(short)
或compareAndSetForkJoinTaskTag(short, short)
用ForkJoinTask以short
值原子标记 ,并使用getForkJoinTaskTag()
进行检查。 该ForkJoinTask实现不使用这些protected
方法或标签用于任何目的,但它们可能是在专门的子类建设使用。 例如,并行图遍历可以使用提供的方法来避免重新访问已经处理的节点/任务。 (用于标记的方法名称部分庞大,以鼓励定义反映其使用模式的方法。)
大多数基本支持方法是final
,用于防止覆盖与内在轻量级任务调度框架内在final
的实现。 开发者创建新的基本样式叉/加入处理应最低限度地实现protected
方法exec()
, setRawResult(V)
,和getRawResult()
,同时还引入,可以在其子类来实现的抽象计算方法,可能依赖于其他protected
由此类提供的方法。
ForkJoinTasks应该执行相对少量的计算。 大任务应该分解成更小的子任务,通常通过递归分解。 作为一个非常粗略的经验法则,一项任务应该执行超过100个和少于10000个基本计算步骤,并且应该避免无限循环。 如果任务太大,那么并行性不能提高吞吐量。 如果太小,则内存和内部任务维护开销可能压倒处理。
该课程为Runnable
和Callable
提供adapt
方法,当将ForkJoinTasks
执行与其他类型的任务混合时可能会使用该方法。 当所有任务都是这种形式时,请考虑使用在asyncMode中构造的池。
ForkJoinTasks是Serializable
,它使它们可以用于扩展,如远程执行框架。 仅在执行之前或之后序列化任务是明智的,但不是在执行期间。 在执行期间不依赖序列化。
Public constructors |
|
---|---|
ForkJoinTask() |
Public methods |
|
---|---|
static <T> ForkJoinTask<T> |
adapt(Runnable runnable, T result) 返回一个新的 |
static ForkJoinTask<?> |
adapt(Runnable runnable) 返回一个新的 |
static <T> ForkJoinTask<T> |
adapt(Callable<? extends T> callable) 返回一个新的 |
boolean |
cancel(boolean mayInterruptIfRunning) 试图取消执行此任务。 |
final boolean |
compareAndSetForkJoinTaskTag(short expect, short update) 原子上有条件地设置此任务的标记值。 |
void |
complete(V value) 完成此任务,如果尚未中止或取消,则返回给定值,作为后续调用 |
void |
completeExceptionally(Throwable ex) 异常完成此任务,如果尚未中止或取消,则导致它在 |
final ForkJoinTask<V> |
fork() 安排在池异步执行这一任务,当前任务运行在(如果适用),或使用 |
final V |
get(long timeout, TimeUnit unit) 如果需要,最多等待计算完成的给定时间,然后检索其结果(如果可用)。 |
final V |
get() 如果需要,等待计算完成,然后检索其结果。 |
final Throwable |
getException() 返回基本计算抛出的异常,或者 |
final short |
getForkJoinTaskTag() 返回此任务的标签。 |
static ForkJoinPool |
getPool() 返回宿主当前线程的池,如果当前线程在任何ForkJoinPool之外执行,则返回 |
static int |
getQueuedTaskCount() 返回当前工作线程已分叉但尚未执行的任务数的估计值。 |
abstract V |
getRawResult() 返回 |
static int |
getSurplusQueuedTaskCount() 返回当前工作线程持有多少本地排队任务的估计值,而不是其他可能窃取它们的工作线程的值,如果此线程未在ForkJoinPool中运行,则返回零。 |
static void |
helpQuiesce() 可能会执行任务,直到承载当前任务的池 is quiescent 。 |
static boolean |
inForkJoinPool() 返回 |
final V |
invoke() 开始执行此任务,如果需要等待其完成,并返回其结果,或者如果基础计算执行此操作,则抛出(未选中) |
static void |
invokeAll(ForkJoinTask...<?> tasks)
|
static void |
invokeAll(ForkJoinTask<?> t1, ForkJoinTask<?> t2)
|
static <T extends ForkJoinTask<?>> Collection<T> |
invokeAll(Collection<T> tasks)
|
final boolean |
isCancelled() 如果此任务在正常完成之前取消,则返回 |
final boolean |
isCompletedAbnormally() 如果此任务引发异常或被取消,则返回 |
final boolean |
isCompletedNormally() 如果此任务完成而没有抛出异常并且未取消,则返回 |
final boolean |
isDone() 如果此任务完成,则返回 |
final V |
join() 返回 |
final void |
quietlyComplete() 通常无需设置值即可完成此任务。 |
final void |
quietlyInvoke() 开始执行此任务并在必要时等待完成,而不返回结果或抛出异常。 |
final void |
quietlyJoin() 加入此任务,但不返回结果或抛出异常。 |
void |
reinitialize() 重置此任务的内部簿记状态,允许随后 |
final short |
setForkJoinTaskTag(short newValue) 以原子方式设置此任务的标记值并返回旧值。 |
boolean |
tryUnfork() 试图排除这个任务的执行。 |
Protected methods |
|
---|---|
abstract boolean |
exec() 立即执行此任务的基本操作,并返回true,如果从此方法返回后,此任务保证已正常完成。 |
static ForkJoinTask<?> |
peekNextLocalTask() 返回但不排除或执行由当前线程排队但尚未执行的任务(如果立即可用)。 |
static ForkJoinTask<?> |
pollNextLocalTask() 如果当前线程正在ForkJoinPool中运行,那么取消调度并返回(不执行)下一个由当前线程排队但尚未执行的任务。 |
static ForkJoinTask<?> |
pollTask() 如果当前线程正在ForkJoinPool中运行,则取消调度并返回(不执行)由当前线程排队但尚未执行的下一个任务(如果有)或者不可用时由其他线程分叉的任务,如果可供使用的话。 |
abstract void |
setRawResult(V value) 因此强制返回给定的值。 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
|
From interface java.util.concurrent.Future
|
ForkJoinTask<T> adapt (Runnable runnable, T result)
返回一个新的 ForkJoinTask
,该 run
执行给定 Runnable
的 run
方法作为其操作,并将给定结果返回到 join()
。
Parameters | |
---|---|
runnable |
Runnable : the runnable action |
result |
T : the result upon completion |
Returns | |
---|---|
ForkJoinTask<T> |
the task |
ForkJoinTask<?> adapt (Runnable runnable)
返回一个新的 ForkJoinTask
,它执行给定 Runnable
的 run
方法作为其操作,并在 join()
返回空结果。
Parameters | |
---|---|
runnable |
Runnable : the runnable action |
Returns | |
---|---|
ForkJoinTask<?> |
the task |
ForkJoinTask<T> adapt (Callable<? extends T> callable)
返回一个新的 ForkJoinTask
,该 call
执行给定 Callable
的 call
方法作为其操作,并在 join()
返回结果,将遇到的任何检查的异常转换为 RuntimeException
。
Parameters | |
---|---|
callable |
Callable : the callable action |
Returns | |
---|---|
ForkJoinTask<T> |
the task |
boolean cancel (boolean mayInterruptIfRunning)
试图取消执行此任务。 如果任务已完成或由于其他原因无法取消,则此尝试将失败。 如果成功,并且调用cancel
时此任务尚未开始,则此任务的执行将被取消。 经过此方法成功返回,除非有介入呼叫reinitialize()
,后续调用isCancelled()
, isDone()
,并cancel
将返回true
,并呼吁join()
,并会导致相关方法CancellationException
。
这个方法可以在子类中被覆盖,但如果是这样的话,仍然必须确保这些属性保持不变。 特别是, cancel
方法本身不能抛出异常。
此方法旨在由其他任务调用。 要终止当前任务,只需从计算方法中返回或抛出一个未检查的异常,或者调用completeExceptionally(Throwable)
。
Parameters | |
---|---|
mayInterruptIfRunning |
boolean : this value has no effect in the default implementation because interrupts are not used to control cancellation. |
Returns | |
---|---|
boolean |
true if this task is now cancelled |
boolean compareAndSetForkJoinTaskTag (short expect, short update)
原子上有条件地设置此任务的标记值。 在其他应用程序中,标记可用作图形操作任务中的访问标记,如在处理之前检查: if (task.compareAndSetForkJoinTaskTag((short)0, (short)1))
方法,否则由于节点已被访问而退出。
Parameters | |
---|---|
expect |
short : the expected tag value |
update |
short : the new tag value |
Returns | |
---|---|
boolean |
true if successful; i.e., the current value was equal to expect and was changed to update . |
void complete (V value)
完成此任务,如果尚未中止或取消,则返回给定值,作为后续调用join
和相关操作的结果。 此方法可用于为异步任务提供结果,或为通常无法完成的任务提供备选处理。 不鼓励在其他情况下使用它。 此方法是可覆盖的,但重写的版本必须调用super
实现来维护保证。
Parameters | |
---|---|
value |
V : the result value for this task |
void completeExceptionally (Throwable ex)
异常完成此任务,如果尚未中止或取消,则导致它在join
和相关操作中抛出给定异常。 此方法可用于诱发异步任务中的异常,或强制完成不会完成的任务。 不鼓励在其他情况下使用它。 此方法是可覆盖的,但被覆盖的版本必须调用super
实现来维护保证。
Parameters | |
---|---|
ex |
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 . |
ForkJoinTask<V> fork ()
安排在池异步执行这一任务,当前任务运行在(如果适用),或使用commonPool()
如果不是inForkJoinPool()
。 虽然它不一定是强制执行的,但除非已完成并重新初始化,否则多次分叉任务是一种使用错误。 对任务状态或其操作的任何数据的后续修改不一定可以由除执行它之外的任何线程始终观察到,除非在调用join()
或相关方法之前,或者调用isDone()
返回true
。
Returns | |
---|---|
ForkJoinTask<V> |
this , to simplify usage |
V get (long timeout, TimeUnit unit)
如果需要,最多等待计算完成的给定时间,然后检索其结果(如果可用)。
Parameters | |
---|---|
timeout |
long : the maximum time to wait |
unit |
TimeUnit : the time unit of the timeout argument |
Returns | |
---|---|
V |
the computed result |
Throws | |
---|---|
CancellationException |
if the computation was cancelled |
ExecutionException |
if the computation threw an exception |
InterruptedException |
if the current thread is not a member of a ForkJoinPool and was interrupted while waiting |
TimeoutException |
if the wait timed out |
V get ()
如果需要,等待计算完成,然后检索其结果。
Returns | |
---|---|
V |
the computed result |
Throws | |
---|---|
CancellationException |
if the computation was cancelled |
ExecutionException |
if the computation threw an exception |
InterruptedException |
if the current thread is not a member of a ForkJoinPool and was interrupted while waiting |
Throwable getException ()
返回由基本计算抛出的异常,或者 CancellationException
如果取消),或者 null
如果没有)或方法尚未完成。
Returns | |
---|---|
Throwable |
the exception, or null if none |
short getForkJoinTaskTag ()
返回此任务的标签。
Returns | |
---|---|
short |
the tag for this task |
ForkJoinPool getPool ()
如果当前线程在任何ForkJoinPool外部执行,则返回承载当前线程的池或 null
。
该方法返回 null
当且仅当 inForkJoinPool()
回报 false
。
Returns | |
---|---|
ForkJoinPool |
the pool, or null if none |
int getQueuedTaskCount ()
返回当前工作线程已分叉但尚未执行的任务数的估计值。 这个值对于是否要分叉其他任务的启发式决策可能很有用。
Returns | |
---|---|
int |
the number of tasks |
V getRawResult ()
返回join()
返回的结果,即使此任务异常完成,或者null
如果此任务未知完成)。 此方法旨在帮助调试以及支持扩展。 不鼓励在任何其他情况下使用它。
Returns | |
---|---|
V |
the result, or null if not completed |
int getSurplusQueuedTaskCount ()
返回当前工作线程持有多少本地排队任务的估计值,而不是其他可能窃取它们的工作线程的值,如果此线程未在ForkJoinPool中运行,则返回零。 这个值对于是否要分叉其他任务的启发式决策可能很有用。 在ForkJoinTasks的许多用法中,在稳定状态下,每个工作人员应该致力于保持一个小的恒定剩余(例如3个)任务,并在超出此阈值时在本地处理计算。
Returns | |
---|---|
int |
the surplus number of tasks, which may be negative |
void helpQuiesce ()
可能会执行任务,直到承载当前任务的池is quiescent 。 这种方法可能用于许多任务分叉的设计中,但没有一个是明确加入的,而是执行它们直到处理完所有任务。
boolean inForkJoinPool ()
返回 true
如果当前线程是 ForkJoinWorkerThread
执行作为ForkJoinPool计算。
Returns | |
---|---|
boolean |
true if the current thread is a ForkJoinWorkerThread executing as a ForkJoinPool computation, or false otherwise |
V invoke ()
开始执行此任务,如果需要等待完成,并返回其结果,或者如果底层计算执行此操作,则抛出(未选中) RuntimeException
或 Error
。
Returns | |
---|---|
V |
the computed result |
void invokeAll (ForkJoinTask...<?> tasks)
isDone
给定的任务,当isDone
对每个任务保持isDone
或遇到(未检查)的异常时返回,在这种情况下重新排除异常。 如果多个任务遇到异常,则此方法将引发这些异常中的任何一个。 如果任何任务遇到异常,其他人可能会被取消。 但是,个别任务的执行状态在异常返回时无法得到保证。 每个任务的状态可以使用getException()
和相关方法来获得,以检查它们是否已被取消,正常或异常完成,还是未处理。
Parameters | |
---|---|
tasks |
ForkJoinTask : the tasks |
Throws | |
---|---|
NullPointerException |
if any task is null |
void invokeAll (ForkJoinTask<?> t1, ForkJoinTask<?> t2)
isDone
给定的任务,当isDone
保持每个任务或遇到(未检查)的异常时返回,在这种情况下,异常被重新抛出。 如果多个任务遇到异常,则此方法将引发这些异常中的任何一个。 如果任何任务遇到异常,则可能会取消另一个任务。 但是,个别任务的执行状态在异常返回时无法得到保证。 每个任务的状态可以使用getException()
和相关方法来获得,以检查它们是否已被取消,正常或异常完成,还是未处理。
Parameters | |
---|---|
t1 |
ForkJoinTask : the first task |
t2 |
ForkJoinTask : the second task |
Throws | |
---|---|
NullPointerException |
if any task is null |
Collection<T> invokeAll (Collection<T> tasks)
isDone
指定集合中的所有任务,当每个任务保持isDone
或遇到(未检查)异常时返回,在这种情况下,将重新抛出异常。 如果多个任务遇到异常,则此方法将引发这些异常中的任何一个。 如果任何任务遇到异常,其他人可能会被取消。 但是,个别任务的执行状态在异常返回时无法得到保证。 每个任务的状态可以使用getException()
和相关方法来获得,以检查它们是否被取消,正常或异常完成,还是未处理。
Parameters | |
---|---|
tasks |
Collection : the collection of tasks |
Returns | |
---|---|
Collection<T> |
the tasks argument, to simplify usage |
Throws | |
---|---|
NullPointerException |
if tasks or any element are null |
boolean isCancelled ()
如果此任务在正常完成之前取消,则返回 true
。
Returns | |
---|---|
boolean |
true if this task was cancelled before it completed |
boolean isCompletedAbnormally ()
如果此任务引发异常或被取消,则返回 true
。
Returns | |
---|---|
boolean |
true if this task threw an exception or was cancelled |
boolean isCompletedNormally ()
如果此任务完成而没有抛出异常并且未取消,则返回 true
。
Returns | |
---|---|
boolean |
true if this task completed without throwing an exception and was not cancelled |
boolean isDone ()
如果此任务完成,则返回true
。 完成可能是由于正常终止,例外或取消 - 在所有这些情况下,此方法将返回true
。
Returns | |
---|---|
boolean |
true if this task completed |
V join ()
返回is done
时的计算结果。 此方法不同于get()
的异常完成结果为RuntimeException
或Error
而不是ExecutionException
,并且调用线程的中断不会导致方法通过抛出InterruptedException
突然返回。
Returns | |
---|---|
V |
the computed result |
void quietlyComplete ()
通常无需设置值即可完成此任务。 setRawResult(V)
(或默认为null
)确定的最新值将作为后续调用join
和相关操作的结果返回。
void quietlyJoin ()
加入此任务,但不返回结果或抛出异常。 在处理某些已被取消或已知中止的任务时,此方法可能很有用。
void reinitialize ()
重置此任务的内部簿记状态,允许随后的fork
。 此方法允许重复使用此任务,但只有当此任务从未分叉,或分叉,然后完成并且此任务的所有未完成连接也已完成时才发生重用。 无法保证其他任何使用条件下的效果。 在循环中执行子任务的预构建树时,此方法可能很有用。
完成此方法后, isDone()
报告false
和getException()
报告null
。 但是, getRawResult
返回的值不受影响。 要清除此值,可以调用setRawResult(null)
。
short setForkJoinTaskTag (short newValue)
以原子方式设置此任务的标记值并返回旧值。
Parameters | |
---|---|
newValue |
short : the new tag value |
Returns | |
---|---|
short |
the previous value of the tag |
boolean tryUnfork ()
试图排除这个任务的执行。 如果此任务是当前线程的最近派生任务,并且尚未开始在另一个线程中执行,则此方法通常(但不能保证)成功。 这种方法在安排替代本地处理可能已经被盗但未被盗的任务时可能很有用。
Returns | |
---|---|
boolean |
true if unforked |
boolean exec ()
立即执行此任务的基本操作,并返回true,如果从此方法返回后,此任务保证已正常完成。 否则,此方法可能会返回false,以指示此任务不一定完成(或未知完成),例如在需要显式调用完成方法的异步操作中。 此方法也可能会引发(未检查)异常以指示异常退出。 此方法旨在支持扩展,通常不应另行调用。
Returns | |
---|---|
boolean |
true if this task is known to have completed normally |
ForkJoinTask<?> peekNextLocalTask ()
返回但不排除或执行由当前线程排队但尚未执行的任务(如果立即可用)。 无法保证此任务将被实际轮询或接下来执行。 相反,即使存在任务,该方法也可以返回空值,但如果没有与其他线程竞争则无法访问该方法。 此方法主要是为了支持扩展而设计的,否则不太可能有用。
Returns | |
---|---|
ForkJoinTask<?> |
the next task, or null if none are available |
ForkJoinTask<?> pollNextLocalTask ()
如果当前线程正在ForkJoinPool中运行,那么取消调度并返回(不执行)下一个由当前线程排队但尚未执行的任务。 此方法主要是为了支持扩展而设计的,否则不太可能有用。
Returns | |
---|---|
ForkJoinTask<?> |
the next task, or null if none are available |
ForkJoinTask<?> pollTask ()
如果当前线程正在ForkJoinPool中运行,则取消调度并返回(不执行)由当前线程排队但尚未执行的下一个任务(如果有)或者不可用时由其他线程分叉的任务,如果可供使用的话。 可用性可能是暂时的,因此null
结果并不一定意味着此任务运行的池的静止。此方法主要是为了支持扩展而设计的,否则不太有用。
Returns | |
---|---|
ForkJoinTask<?> |
a task, or null if none are available |
void setRawResult (V value)
因此强制返回给定的值。 此方法旨在支持扩展,通常不应另行调用。
Parameters | |
---|---|
value |
V : the value |