ForkJoinTask 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
在一个 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
- 继承
- 派生
- 属性
- 实现
注解
在一个 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
与其他类型任务混合使用时,可以使用此方法Runnable
Callable
。 当所有任务都采用此形式时,请考虑使用在 em>asyncMode</em> 中构造的<池。
ForkJoinTasks Serializable
可用于远程执行框架等扩展。 仅序列化任务之前或之后,而不是在执行期间是明智的。 在执行过程中,序列化不依赖于它。
已在 1.7 中添加。
适用于 . 的 java.util.concurrent.ForkJoinTask
Java 文档
本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。
构造函数
ForkJoinTask() |
要调用的子类的构造函数。 |
ForkJoinTask(IntPtr, JniHandleOwnership) |
创建 JNI 对象的托管表示形式时使用的构造函数;由运行时调用。 |
属性
Class |
返回此 |
Exception |
返回基计算引发的异常; |
ForkJoinTaskTag |
返回此任务的标记。 |
Handle |
基础 Android 实例的句柄。 (继承自 Object) |
IsCancelled |
返回 |
IsCompletedAbnormally |
如果此任务引发异常或已取消,则返回 |
IsCompletedNormally |
返回 |
IsDone |
返回 |
JniIdentityHashCode |
在一个 |
JniPeerMembers |
在一个 |
PeerReference |
在一个 |
Pool |
返回托管当前线程的池,或者 |
QueuedTaskCount |
返回当前工作线程分支但尚未执行的任务数的估计值。 |
RawRawResult |
返回将返回 Join()的结果,即使此任务异常完成,或者 |
SurplusQueuedTaskCount |
返回当前工作线程持有的本地排队任务数的估计值,而其他工作线程可能会窃取这些任务,或者如果此线程未在 ForkJoinPool 中运行,则返回零。 |
ThresholdClass |
此 API 支持 Mono for Android 基础结构,不打算直接从代码使用。 |
ThresholdType |
此 API 支持 Mono for Android 基础结构,不打算直接从代码使用。 |
方法
Adapt(ICallable) |
返回一个新 |
Adapt(IRunnable) |
返回一个新 |
Adapt(IRunnable, Object) |
返回一个新 |
Cancel(Boolean) |
尝试取消执行此任务。 |
Clone() |
创建并返回此对象的副本。 (继承自 Object) |
CompareAndSetForkJoinTaskTag(Int16, Int16) |
以原子方式设置此任务的标记值。 |
Complete(Object) |
完成此任务,如果尚未中止或取消,则返回给定值作为后续调用 |
CompleteExceptionally(Throwable) |
异常完成此任务,如果尚未中止或取消,则会导致它引发 |
Dispose() |
在一个 |
Dispose(Boolean) |
在一个 |
Equals(Object) |
指示其他对象是否“等于”此对象。 (继承自 Object) |
Exec() |
如果从此方法返回时,保证此任务已完成,则立即执行此任务的基操作并返回 true。 |
Fork() |
排列在池中异步执行此任务,当前任务在池中运行(如果适用)或使用 |
Get() |
根据需要等待计算完成,然后检索其结果。 |
Get(Int64, TimeUnit) |
如果需要,最多等待给定时间计算完成,然后检索其结果(如果可用)。 |
GetHashCode() |
返回对象的哈希代码值。 (继承自 Object) |
HelpQuiesce() |
可能执行任务,直到托管当前任务 ForkJoinPool#isQuiescent 的池处于静止状态。 |
InForkJoinPool() |
如果当前线程作为 |
Invoke() |
开始执行此任务,如有必要,等待其完成,并返回其结果,或引发(未检查) |
InvokeAll(ForkJoinTask, ForkJoinTask) |
分叉给定的任务,返回每个任务的保留时间 |
InvokeAll(ForkJoinTask[]) |
指定集合中的所有任务分叉,返回每个任务的保留时间 |
InvokeAll(ICollection) |
指定集合中的所有任务分叉,返回每个任务的保留时间 |
JavaFinalize() |
当垃圾回收确定不再引用该对象时,由对象上的垃圾回收器调用。 (继承自 Object) |
Join() |
在计算完成 #isDone 时返回计算结果。 |
Notify() |
唤醒正在等待此对象的监视器的单个线程。 (继承自 Object) |
NotifyAll() |
唤醒正在等待此对象的监视器的所有线程。 (继承自 Object) |
PeekNextLocalTask() |
如果任务立即可用,则返回当前线程排队但尚未执行的任务,但不会取消计划或执行。 |
PollNextLocalTask() |
如果当前线程在 ForkJoinPool 中运行,则取消计划并返回下一个任务,该任务由当前线程排队,但尚未执行。 |
PollTask() |
如果当前线程在 ForkJoinPool 中操作,则取消计划并返回(如果不执行),则当前线程排入队列但尚未执行下一个任务(如果可用)或不可用,则为其他线程分支的任务(如果可用)。 |
QuietlyComplete() |
通常无需设置值即可完成此任务。 |
QuietlyInvoke() |
开始执行此任务,并在必要时等待其完成,而不返回其结果或引发异常。 |
QuietlyJoin() |
联接此任务,而不返回其结果或引发异常。 |
Reinitialize() |
重置此任务的内部记帐状态,允许后续 |
SetForkJoinTaskTag(Int16) |
以原子方式设置此任务的标记值并返回旧值。 |
SetHandle(IntPtr, JniHandleOwnership) |
设置 Handle 属性。 (继承自 Object) |
SetRawResult(Object) |
强制返回给定值作为结果。 |
ToArray<T>() |
在一个 |
ToString() |
返回对象的字符串表示形式。 (继承自 Object) |
TryUnfork() |
尝试取消计划此任务以执行。 |
UnregisterFromRuntime() |
在一个 |
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() |
在一个 |
IJavaPeerable.DisposeUnlessReferenced() |
在一个 |
IJavaPeerable.Finalized() |
在一个 |
IJavaPeerable.JniManagedPeerState |
在一个 |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
在一个 |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
在一个 |
IJavaPeerable.SetPeerReference(JniObjectReference) |
在一个 |
扩展方法
JavaCast<TResult>(IJavaObject) |
执行 Android 运行时检查的类型转换。 |
JavaCast<TResult>(IJavaObject) |
在一个 |
GetJniTypeName(IJavaPeerable) |
在一个 |
GetAsync(IFuture) |
在一个 |
GetAsync(IFuture, Int64, TimeUnit) |
在一个 |