ForkJoinTask 类

定义

在 中 ForkJoinPool运行的任务的抽象基类。

[Android.Runtime.Register("java/util/concurrent/ForkJoinTask", DoNotGenerateAcw=true)]
[Java.Interop.JavaTypeParameters(new System.String[] { "V" })]
public abstract class ForkJoinTask : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, Java.IO.ISerializable, Java.Util.Concurrent.IFuture
[<Android.Runtime.Register("java/util/concurrent/ForkJoinTask", DoNotGenerateAcw=true)>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "V" })>]
type ForkJoinTask = class
    inherit Object
    interface ISerializable
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
    interface IFuture
继承
ForkJoinTask
派生
属性
实现

注解

在 中 ForkJoinPool运行的任务的抽象基类。 是 ForkJoinTask 一个类似线程的实体,其权重比普通线程轻得多。 大量任务和子任务可能由 ForkJoinPool 中的少量实际线程托管,但代价是存在一些使用限制。

“main”ForkJoinTask在显式提交到 ForkJoinPool时开始执行,或者,如果尚未参与 ForkJoin 计算,则通过 #fork#invoke或相关方法开始ForkJoinPool#commonPool()执行。 启动后,它通常会依次启动其他子任务。 如此类的名称所示,许多使用 ForkJoinTask 的程序仅使用 方法和 #fork#join,或派生类,例如 #invokeAll(ForkJoinTask...) invokeAll。 但是,此类还提供了许多其他方法,这些方法可在高级用法中发挥作用,以及允许支持新形式的分支/联接处理的扩展机制。

ForkJoinTask 的一种 Future轻型形式。 的效率ForkJoinTask源于一组限制 (,这些限制仅部分静态强制执行,) 反映其main用作计算纯函数或对纯隔离对象进行操作的计算任务。 主要协调机制是 #fork(排列异步执行)和 #join(在计算完任务的结果之前不会继续执行)。 理想情况下,计算应避免 synchronized 使用方法或块,并且除了联接其他任务或使用同步器(如播发的用于配合分叉/联接计划)的同步器外,还应尽量减少其他阻塞同步。 可细分任务也不应执行阻塞 I/O,理想情况下,应访问完全独立于其他正在运行的任务访问的变量。 这些准则通过不允许引发等 IOExceptions 已检查的异常来松散地强制实施。 但是,计算可能仍会遇到未检查的异常,这些异常会重新引发给尝试加入这些异常的调用方。 这些异常可能 RejectedExecutionException 还包括内部资源耗尽导致的异常,例如无法分配内部任务队列。 重新引发异常的行为方式与常规异常相同,但尽可能包含 (显示的堆栈跟踪,例如,使用 ex.printStackTrace() 启动计算的线程以及实际遇到异常的线程的) ;仅使用后者。

可以定义和使用可能会阻止的 ForkJoinTasks,但这样做还需要另外三个注意事项: (1) 完成少量任务(如果任何其他 <<em>/em> 任务应依赖于阻止外部同步或 I/O 的任务)。 例如,从未联接 (的事件样式异步任务,这些子类 CountedCompleter) 通常属于此类别。 (2) 为了尽量减少对资源的影响,任务应较小:理想情况下,仅执行 (可能) 阻止操作。 (3) 除非 ForkJoinPool.ManagedBlocker 使用了 API,或者已知可能阻止的任务数小于池的 ForkJoinPool#getParallelism 级别,否则池无法保证有足够的线程可用于确保进度或良好性能。

等待完成和提取任务 #join结果的主要方法是 ,但有几个变体:方法 Future#get 支持可中断和/或计时等待完成,并使用 Future 约定报告结果。 方法 #invoke 在语义上等效于 fork(); join() ,但始终尝试在当前线程中开始执行。 这些方法的“<em>quiet</em>”形式不会提取结果或报告异常。 在执行一组任务时,这些操作可能很有用,并且需要延迟结果或异常的处理,直到所有任务完成。 方法 invokeAll (在多个版本中可用,) 执行最常见的并行调用形式:分叉一组任务并将它们全部联接。

在最典型的用法中,分支联接对的作用类似于调用 (分叉) ,并从并行递归函数返回 (联接) 。 与其他形式的递归调用一样, 返回 (联接,) 应首先执行。 例如, a.fork(); b.fork(); b.join(); a.join(); 可能比之前b加入 a 的效率要高得多。

可以在多个详细级别查询任务的执行状态: #isDone 如果任务以任何方式完成 (包括取消任务而没有执行) 的情况,则为 true; #isCompletedNormally 如果任务未取消或遇到异常,则为 true; #isCancelled 如果任务被取消 (在这种情况下 #getException 返回 CancellationException) ,则为 true; #isCompletedAbnormally 如果任务被取消或遇到异常,则为 true, 在这种情况下 #getException ,将返回遇到的异常或 CancellationException

ForkJoinTask 类通常不是直接子类。 相反,你可以将支持特定样式的分支/联接处理的抽象类之一子类子类,通常 RecursiveAction 适用于大多数不返回结果的计算、 RecursiveTask 那些返回结果的计算,以及 CountedCompleter 完成的操作触发其他操作的计算。 通常,具体的 ForkJoinTask 子类声明包含其参数的字段(在构造函数中建立),然后定义以 compute 某种方式使用此基类提供的控制方法的方法。

方法 #join 及其变体仅在完成依赖项是无周期性的时才适合使用;也就是说,并行计算可描述为有向无环图 (DAG) 。 否则,由于任务循环等待彼此,执行可能会遇到某种形式的死锁。 但是,此框架支持其他方法和技术 (例如,使用 Phaser#helpQuiesce和) ,这些方法和技术 #complete 可用于为未静态构造为 DAG 的问题构建自定义子类。 为了支持此类用法,ForkJoinTask 可能以#setForkJoinTaskTag原子方式><使用< 或 #compareAndSetForkJoinTaskTag 标记/em> 值short,并使用 #getForkJoinTaskTag进行检查。 ForkJoinTask 实现不会将这些 protected 方法或标记用于任何目的,但它们可用于专用子类的构造。 例如,并行图形遍历可以使用提供的方法避免重新访问已处理的节点/任务。 (标记的方法名称很庞大,部分是为了鼓励定义反映其使用模式的方法。)

大多数基本支持方法是 final,以防止重写固有绑定到基础轻型任务计划框架的实现。 创建分支/联接处理的新基本样式的开发人员应至少实现 protected 方法 #exec#setRawResult#getRawResult,同时引入可以在其子类中实现的抽象计算方法,可能依赖于此类提供的其他 protected 方法。

ForkJoinTasks 应执行相对较少的计算。 大型任务应拆分为较小的子任务,通常通过递归分解。 作为一个非常粗略的经验法则,任务应执行超过 100 且少于 10000 个基本计算步骤,并应避免无限循环。 如果任务太大,则并行度无法提高吞吐量。 如果太小,内存和内部任务维护开销可能会使处理不堪重负。

此类为 和 Callable提供adapt方法,在将 的执行ForkJoinTasks与其他类型的任务混合使用时,这些方法Runnable可能使用。 当所有任务都采用此形式时,请考虑使用在 em>asyncMode</em> 中<构造的池。

ForkJoinTasks 是 Serializable,这使它们能够在远程执行框架等扩展中使用。 最好仅在执行之前或之后(而不是在执行期间)序列化任务。 在执行过程中,序列化本身不受依赖。

在 1.7 中添加。

java.util.concurrent.ForkJoinTaskJava 文档。

此页面的某些部分是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的条款使用。

构造函数

ForkJoinTask()

要调用的子类的构造函数。

ForkJoinTask(IntPtr, JniHandleOwnership)

创建 JNI 对象的托管表示形式时使用的构造函数;由运行时调用。

属性

Class

返回此 Object的运行时类。

(继承自 Object)
Exception

返回基础计算引发的异常,如果 CancellationException 已取消,则返回 , null 如果没有或方法尚未完成,则返回 。

ForkJoinTaskTag

返回此任务的标记。

Handle

基础 Android 实例的句柄。

(继承自 Object)
IsCancelled

true如果此任务在正常完成之前被取消,则返回 。

IsCompletedAbnormally

true如果此任务引发异常或被取消,则返回 。

IsCompletedNormally

true如果此任务完成但不引发异常且未取消,则返回 。

IsDone

如果此任务已完成,则 true 返回 。

JniIdentityHashCode

在 中 ForkJoinPool运行的任务的抽象基类。

(继承自 Object)
JniPeerMembers

在 中 ForkJoinPool运行的任务的抽象基类。

PeerReference

在 中 ForkJoinPool运行的任务的抽象基类。

(继承自 Object)
Pool

如果当前线程在任何 ForkJoinPool 之外执行, null 则返回承载当前线程的池。

QueuedTaskCount

返回当前工作线程已分叉但尚未执行的任务数的估计值。

RawRawResult

返回将由 返回 Join()的结果,即使此任务异常完成,或者 null 此任务未知已完成也是如此。

SurplusQueuedTaskCount

返回当前工作线程持有的本地排队任务数的估计值,如果此线程未在 ForkJoinPool 中运行,则返回可能窃取这些任务的其他工作线程数;如果此线程未在 ForkJoinPool 中运行,则返回零。

ThresholdClass

此 API 支持 Mono for Android 基础结构,不应直接从代码中使用。

ThresholdType

此 API 支持 Mono for Android 基础结构,不应直接从代码中使用。

方法

Adapt(ICallable)

返回一个新的 ForkJoinTask ,它执行 call 给定 Callable 的 方法作为其操作,并在 时 #join返回其结果,并将遇到的 RuntimeException任何已检查异常转换为 。

Adapt(IRunnable)

返回一个新的 ForkJoinTask ,它执行 run 给定 Runnable 的 方法作为其操作,并在 上 #join返回 null 结果。

Adapt(IRunnable, Object)

返回一个新的 ForkJoinTask ,它执行 run 给定 Runnable 的 方法作为其操作,并在 上 #join返回给定的结果。

Cancel(Boolean)

尝试取消此任务的执行。

Clone()

创建并返回此对象的副本。

(继承自 Object)
CompareAndSetForkJoinTaskTag(Int16, Int16)

以原子方式设置此任务的标记值。

Complete(Object)

完成此任务,如果尚未中止或取消,则返回给定值作为后续调用 join 和相关操作的结果。

CompleteExceptionally(Throwable)

异常地完成此任务,如果尚未中止或取消,则会导致它在 和相关操作上 join 引发给定的异常。

Dispose()

在 中 ForkJoinPool运行的任务的抽象基类。

(继承自 Object)
Dispose(Boolean)

在 中 ForkJoinPool运行的任务的抽象基类。

(继承自 Object)
Equals(Object)

指示某个其他对象是否“等于”此对象。

(继承自 Object)
Exec()

如果从此方法返回时保证此任务已完成,则立即执行此任务的基本操作并返回 true。

Fork()

安排在当前任务正在运行的池中异步执行此任务(如果适用),或者使用 ForkJoinPool#commonPool() (如果不是 #inForkJoinPool)。

Get()

如有必要,等待计算完成,然后检索其结果。

Get(Int64, TimeUnit)

如有必要,最多在给定时间等待计算完成,然后检索其结果(如果可用)。

GetHashCode()

返回对象的哈希代码值。

(继承自 Object)
HelpQuiesce()

可能会执行任务,直到托管当前任务的 ForkJoinPool#isQuiescent 的池处于静止状态。

InForkJoinPool()

true如果当前线程是作为 ForkJoinPool 计算执行的 ,ForkJoinWorkerThread则返回 。

Invoke()

开始执行此任务,在必要时等待其完成,并返回其结果,或引发未选中 () RuntimeExceptionError 基础计算执行此操作。

InvokeAll(ForkJoinTask, ForkJoinTask)

创建给定任务的分支,当 isDone 每个任务的保留或 (未选中) 遇到异常时返回,在这种情况下,将重新引发异常。

InvokeAll(ForkJoinTask[])

为指定集合中的所有任务创建分支,当 isDone 每个任务的保留或 (未选中) 异常时返回,在这种情况下,将重新引发异常。

InvokeAll(ICollection)

为指定集合中的所有任务创建分支,当 isDone 每个任务的保留或 (未选中) 异常时返回,在这种情况下,将重新引发异常。

JavaFinalize()

当垃圾回收确定不再引用对象时,由垃圾回收器对对象调用。

(继承自 Object)
Join()

返回计算 #isDone 完成时的结果。

Notify()

唤醒正在等待此对象的监视器的单个线程。

(继承自 Object)
NotifyAll()

唤醒正在等待此对象的监视器的所有线程。

(继承自 Object)
PeekNextLocalTask()

如果当前线程立即可用,则返回当前线程排队但尚未执行的任务,但不取消计划或执行该任务。

PollNextLocalTask()

如果当前线程在 ForkJoinPool 中运行,则取消计划并返回当前线程排队但尚未执行的下一个任务,但不执行。

PollTask()

如果当前线程在 ForkJoinPool 中运行,则取消计划并返回由当前线程排队但尚未执行的下一个任务(如果可用)或(如果不可用)由其他线程分支的任务(如果可用)。

QuietlyComplete()

正常完成此任务而不设置值。

QuietlyInvoke()

开始执行此任务,并在必要时等待其完成,而不会返回其结果或引发异常。

QuietlyJoin()

联接此任务,而不返回其结果或引发异常。

Reinitialize()

重置此任务的内部记账状态,允许后续 fork

SetForkJoinTaskTag(Int16)

以原子方式设置此任务的标记值,并返回旧值。

SetHandle(IntPtr, JniHandleOwnership)

设置 Handle 属性。

(继承自 Object)
SetRawResult(Object)

强制给定值作为结果返回。

ToArray<T>()

在 中 ForkJoinPool运行的任务的抽象基类。

(继承自 Object)
ToString()

返回对象的字符串表示形式。

(继承自 Object)
TryUnfork()

尝试取消计划此任务以供执行。

UnregisterFromRuntime()

在 中 ForkJoinPool运行的任务的抽象基类。

(继承自 Object)
Wait()

导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>。<>

(继承自 Object)
Wait(Int64)

导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<>

(继承自 Object)
Wait(Int64, Int32)

导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<>

(继承自 Object)

显式接口实现

IJavaPeerable.Disposed()

在 中 ForkJoinPool运行的任务的抽象基类。

(继承自 Object)
IJavaPeerable.DisposeUnlessReferenced()

在 中 ForkJoinPool运行的任务的抽象基类。

(继承自 Object)
IJavaPeerable.Finalized()

在 中 ForkJoinPool运行的任务的抽象基类。

(继承自 Object)
IJavaPeerable.JniManagedPeerState

在 中 ForkJoinPool运行的任务的抽象基类。

(继承自 Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

在 中 ForkJoinPool运行的任务的抽象基类。

(继承自 Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

在 中 ForkJoinPool运行的任务的抽象基类。

(继承自 Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

在 中 ForkJoinPool运行的任务的抽象基类。

(继承自 Object)

扩展方法

JavaCast<TResult>(IJavaObject)

执行 Android 运行时检查的类型转换。

JavaCast<TResult>(IJavaObject)

在 中 ForkJoinPool运行的任务的抽象基类。

GetJniTypeName(IJavaPeerable)

在 中 ForkJoinPool运行的任务的抽象基类。

GetAsync(IFuture)

在 中 ForkJoinPool运行的任务的抽象基类。

GetAsync(IFuture, Int64, TimeUnit)

在 中 ForkJoinPool运行的任务的抽象基类。

适用于