- java.lang.Object
-
- java.util.concurrent.ForkJoinTask<Void>
-
- java.util.concurrent.RecursiveAction
-
- 实现的所有接口
-
Serializable,Future<Void>
public abstract class RecursiveAction extends ForkJoinTask<Void>
递归无结果ForkJoinTask。 此类建立用于参数化无结果操作的约定,如VoidForkJoinTasks。 因为null类型是唯一有效的值Void,如方法join总是返回null完成时。示例用法。 这是一个简单但完整的ForkJoin排序,可以对给定的
long[]数组进行排序:然后,您可以通过创建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++]; } }new SortTask(anArray)并在ForkJoinPool中调用它来对anArray进行排序。 作为一个更具体的简单示例,以下任务会增加数组的每个元素: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不需要完全递归,只要它们保持基本的分而治之的方法即可。 这是一个对双数组的每个元素的平方进行求和的类,通过将重复除法的右侧细分为2,并使用
next引用链来跟踪它们。 它使用基于方法getSurplusQueuedTaskCount的动态阈值,但通过直接对未完成的任务执行叶子操作而不是进一步细分来抵消潜在的过度分区。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
- 另请参见:
- Serialized Form
-
-
构造方法摘要
构造方法 构造器 描述 RecursiveAction()
-
方法摘要
所有方法 实例方法 抽象方法 具体的方法 变量和类型 方法 描述 protected abstract voidcompute()该任务执行的主要计算。protected booleanexec()实现RecursiveActions的执行约定。VoidgetRawResult()始终返回null。protected voidsetRawResult(Void mustBeNull)需要null完成值。-
声明方法的类 java.util.concurrent.ForkJoinTask
adapt, adapt, adapt, cancel, compareAndSetForkJoinTaskTag, complete, completeExceptionally, fork, get, get, getException, getForkJoinTaskTag, getPool, getQueuedTaskCount, getSurplusQueuedTaskCount, helpQuiesce, inForkJoinPool, invoke, invokeAll, invokeAll, invokeAll, isCompletedAbnormally, isCompletedNormally, join, peekNextLocalTask, pollNextLocalTask, pollSubmission, pollTask, quietlyComplete, quietlyInvoke, quietlyJoin, reinitialize, setForkJoinTaskTag, tryUnfork
-
声明方法的类 java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
声明方法的接口 java.util.concurrent.Future
isCancelled, isDone
-
-
-
-
方法详细信息
-
compute
protected abstract void compute()
该任务执行的主要计算。
-
getRawResult
public final Void getRawResult()
始终返回null。- Specified by:
-
getRawResult类ForkJoinTask<Void> - 结果
-
总是
null
-
setRawResult
protected final void setRawResult(Void mustBeNull)
需要null完成值。- Specified by:
-
setRawResult在类ForkJoinTask<Void> - 参数
-
mustBeNull- 该值
-
exec
protected final boolean exec()
实现RecursiveActions的执行约定。- Specified by:
-
exec在类ForkJoinTask<Void> - 结果
-
true如果已知此任务已正常完成
-
-