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”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.ForkJoinTask
Java 文档。
此页面的某些部分是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的条款使用。
构造函数
ForkJoinTask() |
要调用的子类的构造函数。 |
ForkJoinTask(IntPtr, JniHandleOwnership) |
创建 JNI 对象的托管表示形式时使用的构造函数;由运行时调用。 |
属性
Class |
返回此 |
Exception |
返回基础计算引发的异常,如果 |
ForkJoinTaskTag |
返回此任务的标记。 |
Handle |
基础 Android 实例的句柄。 (继承自 Object) |
IsCancelled |
|
IsCompletedAbnormally |
|
IsCompletedNormally |
|
IsDone |
如果此任务已完成,则 |
JniIdentityHashCode |
在 中 |
JniPeerMembers |
在 中 |
PeerReference |
在 中 |
Pool |
如果当前线程在任何 ForkJoinPool 之外执行, |
QueuedTaskCount |
返回当前工作线程已分叉但尚未执行的任务数的估计值。 |
RawRawResult |
返回将由 返回 Join()的结果,即使此任务异常完成,或者 |
SurplusQueuedTaskCount |
返回当前工作线程持有的本地排队任务数的估计值,如果此线程未在 ForkJoinPool 中运行,则返回可能窃取这些任务的其他工作线程数;如果此线程未在 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) |
在 中 |