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

A ForkJoinTask 是一种 Future轻型形式。 s 的效率 ForkJoinTask源于一组限制(这些限制仅部分静态强制实施),反映其主要用途,即计算纯函数或对纯隔离对象进行操作的计算任务。 主要协调机制是 #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 (在多个版本中可用)执行最常见的并行调用形式:分叉一组任务并将其全部联接。

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

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

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

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

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

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

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

ForkJoinTasks Serializable可用于远程执行框架等扩展。 仅序列化任务之前或之后,而不是在执行期间是明智的。 在执行过程中,序列化不依赖于它。

已在 1.7 中添加。

适用于 . 的 java.util.concurrent.ForkJoinTaskJava 文档

本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。

构造函数

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

返回托管当前线程的池,或者 null 当前线程正在任何 ForkJoinPool 外部执行。

QueuedTaskCount

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

RawRawResult

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

SurplusQueuedTaskCount

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

ThresholdClass

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

ThresholdType

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

方法

Adapt(ICallable)

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

Adapt(IRunnable)

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

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()

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

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中运行的任务的抽象基类。

适用于