RecursiveAction 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
递归的结果。ForkJoinTask
[Android.Runtime.Register("java/util/concurrent/RecursiveAction", DoNotGenerateAcw=true)]
public abstract class RecursiveAction : Java.Util.Concurrent.ForkJoinTask
[<Android.Runtime.Register("java/util/concurrent/RecursiveAction", DoNotGenerateAcw=true)>]
type RecursiveAction = class
inherit ForkJoinTask
- 继承
- 属性
注解
递归的结果。ForkJoinTask 此类建立将无结果操作参数化为 VoidForkJoinTasks 的约定。 由于 null 是类型 Void的唯一有效值,因此方法(如 join 在完成时始终返回 null )。
<b>示例用法。</b> 下面是对给定 long[] 数组进行排序的简单但完整的 ForkJoin 排序:
{@code
static class SortTask extends RecursiveAction {
final long[] array; final int lo, hi;
SortTask(long[] array, int lo, int hi) {
this.array = array; this.lo = lo; this.hi = hi;
}
SortTask(long[] array) { this(array, 0, array.length); }
protected void compute() {
if (hi - lo < THRESHOLD)
sortSequentially(lo, hi);
else {
int mid = (lo + hi) >>> 1;
invokeAll(new SortTask(array, lo, mid),
new SortTask(array, mid, hi));
merge(lo, mid, hi);
}
}
// implementation details follow:
static final int THRESHOLD = 1000;
void sortSequentially(int lo, int hi) {
Arrays.sort(array, lo, hi);
}
void merge(int lo, int mid, int hi) {
long[] buf = Arrays.copyOfRange(array, lo, mid);
for (int i = 0, j = lo, k = mid; i < buf.length; j++)
array[j] = (k == hi || buf[i] < array[k]) ?
buf[i++] : array[k++];
}
}}
然后,可以通过在 ForkJoinPool 中创建new SortTask(anArray)和调用它进行排序anArray。 作为一个更具体的简单示例,以下任务递增数组的每个元素:
{@code
class IncrementTask extends RecursiveAction {
final long[] array; final int lo, hi;
IncrementTask(long[] array, int lo, int hi) {
this.array = array; this.lo = lo; this.hi = hi;
}
protected void compute() {
if (hi - lo < THRESHOLD) {
for (int i = lo; i < hi; ++i)
array[i]++;
}
else {
int mid = (lo + hi) >>> 1;
invokeAll(new IncrementTask(array, lo, mid),
new IncrementTask(array, mid, hi));
}
}
}}
以下示例演示了一些可能导致性能更佳的精简和习惯:只要递归方法保持基本划分和征服方法,RecursiveActions 就不需要完全递归。 下面是一个类,它通过将重复除法的右侧细分为两个,并使用引用链 next 跟踪它们,来对双数组的每个元素的平方求和。 它使用基于方法 getSurplusQueuedTaskCount的动态阈值,但通过直接对未被盗任务执行叶操作而不是进一步细分来抵消潜在的过度分区。
{@code
double sumOfSquares(ForkJoinPool pool, double[] array) {
int n = array.length;
Applyer a = new Applyer(array, 0, n, null);
pool.invoke(a);
return a.result;
}
class Applyer extends RecursiveAction {
final double[] array;
final int lo, hi;
double result;
Applyer next; // keeps track of right-hand-side tasks
Applyer(double[] array, int lo, int hi, Applyer next) {
this.array = array; this.lo = lo; this.hi = hi;
this.next = next;
}
double atLeaf(int l, int h) {
double sum = 0;
for (int i = l; i < h; ++i) // perform leftmost base step
sum += array[i] * array[i];
return sum;
}
protected void compute() {
int l = lo;
int h = hi;
Applyer right = null;
while (h - l > 1 && getSurplusQueuedTaskCount() <= 3) {
int mid = (l + h) >>> 1;
right = new Applyer(array, mid, h, right);
right.fork();
h = mid;
}
double sum = atLeaf(l, h);
while (right != null) {
if (right.tryUnfork()) // directly calculate if not stolen
sum += right.atLeaf(right.lo, right.hi);
else {
right.join();
sum += right.result;
}
right = right.next;
}
result = sum;
}
}}
已在 1.7 中添加。
Java文档java.util.concurrent.RecursiveAction。
本页的某些部分是根据 创建和共享的工作进行的修改,并根据 许可证中所述的条款使用。
构造函数
| 名称 | 说明 |
|---|---|
| RecursiveAction() |
要调用的子类的构造函数。 |
| RecursiveAction(IntPtr, JniHandleOwnership) |
创建 JNI 对象的托管表示形式时使用的构造函数;由运行时调用。 |
属性
| 名称 | 说明 |
|---|---|
| Class |
返回此 |
| Exception |
返回基计算引发的异常; |
| ForkJoinTaskTag |
返回此任务的标记。 (继承自 ForkJoinTask) |
| Handle |
基础 Android 实例的句柄。 (继承自 Object) |
| IsCancelled |
返回 |
| IsCompletedAbnormally |
如果此任务引发异常或已取消,则返回 |
| IsCompletedNormally |
返回 |
| IsDone |
返回 |
| JniIdentityHashCode |
递归的结果。 |
| JniPeerMembers |
递归的结果。 |
| PeerReference |
递归的结果。 |
| RawRawResult |
返回将返回 Join()的结果,即使此任务异常完成,或者 |
| ThresholdClass |
此 API 支持 Mono for Android 基础结构,不打算直接从代码使用。 |
| ThresholdType |
此 API 支持 Mono for Android 基础结构,不打算直接从代码使用。 |
方法
| 名称 | 说明 |
|---|---|
| Cancel(Boolean) |
尝试取消执行此任务。 (继承自 ForkJoinTask) |
| Clone() |
创建并返回此对象的副本。 (继承自 Object) |
| CompareAndSetForkJoinTaskTag(Int16, Int16) |
以原子方式设置此任务的标记值。 (继承自 ForkJoinTask) |
| Complete(Object) |
完成此任务,如果尚未中止或取消,则返回给定值作为后续调用 |
| CompleteExceptionally(Throwable) |
异常完成此任务,如果尚未中止或取消,则会导致它引发 |
| Compute() |
此任务执行的主要计算。 |
| Dispose() |
递归的结果。 |
| Dispose(Boolean) |
递归的结果。 |
| Equals(Object) |
指示其他对象是否“等于”此对象。 (继承自 Object) |
| ExceptionNow() |
递归的结果。 |
| Exec() |
实现 RecursiveActions 的执行约定。 |
| Fork() |
排列在池中异步执行此任务,当前任务在池中运行(如果适用)或使用 |
| Get() |
根据需要等待计算完成,然后检索其结果。 (继承自 ForkJoinTask) |
| Get(Int64, TimeUnit) |
如果需要,最多等待给定时间计算完成,然后检索其结果(如果可用)。 (继承自 ForkJoinTask) |
| GetHashCode() |
返回对象的哈希代码值。 (继承自 Object) |
| Invoke() |
开始执行此任务,如有必要,等待其完成,并返回其结果,或引发(未检查) |
| JavaFinalize() |
当垃圾回收确定不再引用该对象时,由对象上的垃圾回收器调用。 (继承自 Object) |
| Join() |
在计算完成 #isDone 时返回计算结果。 (继承自 ForkJoinTask) |
| Notify() |
唤醒正在等待此对象的监视器的单个线程。 (继承自 Object) |
| NotifyAll() |
唤醒正在等待此对象的监视器的所有线程。 (继承自 Object) |
| QuietlyComplete() |
通常无需设置值即可完成此任务。 (继承自 ForkJoinTask) |
| QuietlyInvoke() |
开始执行此任务,并在必要时等待其完成,而不返回其结果或引发异常。 (继承自 ForkJoinTask) |
| QuietlyJoin() |
联接此任务,而不返回其结果或引发异常。 (继承自 ForkJoinTask) |
| QuietlyJoin(Int64, TimeUnit) |
尝试加入此任务,如果在给定超时之前完成(可能异常),并且当前线程尚未中断,则返回 true。 (继承自 ForkJoinTask) |
| QuietlyJoinUninterruptibly(Int64, TimeUnit) |
尝试加入此任务,如果在给定超时之前完成(可能异常),则返回 true。 (继承自 ForkJoinTask) |
| Reinitialize() |
重置此任务的内部记帐状态,允许后续 |
| ResultNow() |
递归的结果。 |
| SetForkJoinTaskTag(Int16) |
以原子方式设置此任务的标记值并返回旧值。 (继承自 ForkJoinTask) |
| SetHandle(IntPtr, JniHandleOwnership) |
设置 Handle 属性。 (继承自 Object) |
| SetRawResult(Object) |
强制返回给定值作为结果。 (继承自 ForkJoinTask) |
| State() |
递归的结果。 |
| ToArray<T>() |
递归的结果。 |
| ToString() |
返回对象的字符串表示形式。 (继承自 Object) |
| TryUnfork() |
尝试取消计划此任务以执行。 (继承自 ForkJoinTask) |
| UnregisterFromRuntime() |
递归的结果。 |
| Wait() |
使当前线程等待,直到唤醒它,通常是通过 em 通知/em< 或 >em<interrupted>/em<。><> (继承自 Object) |
| Wait(Int64, Int32) |
使当前线程等待直到唤醒,通常是通过 <em>通知</em> 或 <em interrupted>/em<>,或直到经过一定数量的实时。 (继承自 Object) |
| Wait(Int64) |
使当前线程等待直到唤醒,通常是通过 <em>通知</em> 或 <em interrupted>/em<>,或直到经过一定数量的实时。 (继承自 Object) |
显式接口实现
| 名称 | 说明 |
|---|---|
| IJavaPeerable.Disposed() |
递归的结果。 |
| IJavaPeerable.DisposeUnlessReferenced() |
递归的结果。 |
| IJavaPeerable.Finalized() |
递归的结果。 |
| IJavaPeerable.JniManagedPeerState |
递归的结果。 |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
递归的结果。 |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
递归的结果。 |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
递归的结果。 |
扩展方法
| 名称 | 说明 |
|---|---|
| GetAsync(IFuture, Int64, TimeUnit) |
递归的结果。 |
| GetAsync(IFuture) |
递归的结果。 |
| GetJniTypeName(IJavaPeerable) |
获取实例 |
| JavaAs<TResult>(IJavaPeerable) |
尝试强制 |
| JavaCast<TResult>(IJavaObject) |
执行 Android 运行时检查的类型转换。 |
| JavaCast<TResult>(IJavaObject) |
递归的结果。 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
尝试强制 |