public abstract class RecursiveAction extends ForkJoinTask<Void>
ForkJoinTask
。このクラスは、Void
ForkJoinTask
のような結果の出ないアクションをパラメータ化するための規則を確立します。
null
は Void
型の唯一の有効な値であるため、join などのメソッドは完了時に常に null
を返します。
使用例。 ここでは、指定された long[]
配列をソートする ForkJoin ソートの概略を示します。
class SortTask extends RecursiveAction {
final long[] array; final int lo; final int hi;
SortTask(long[] array, int lo, int hi) {
this.array = array; this.lo = lo; this.hi = hi;
}
protected void compute() {
if (hi - lo < THRESHOLD)
sequentiallySort(array, lo, hi);
else {
int mid = (lo + hi) >>> 1;
invokeAll(new SortTask(array, lo, mid),
new SortTask(array, mid, hi));
merge(array, lo, hi);
}
}
}
次に、new SortTask(anArray, 0, anArray.length-1)
を作成し、それを ForkJoinPool で呼び出すことによって anArray
をソートできます。より具体的な簡単な例として、次のタスクでは配列の各要素が増分されます。
class IncrementTask extends RecursiveAction {
final long[] array; final int lo; final int 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));
}
}
}
次の例は、パフォーマンスを向上させる可能性のある調整や方法のいくつかを示しています。RecursiveAction は、基本的な分割統治法を維持しているかぎり、完全に再帰的である必要はありません。ここでは、繰り返し除算の右辺のみを 2 で分割し、それらを next
参照のチェーンで追跡することによって double 配列の各要素の 2 乗を合計するクラスを示します。これは 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;
}
}
コンストラクタと説明 |
---|
RecursiveAction() |
修飾子と型 | メソッドと説明 |
---|---|
protected abstract void |
compute()
このタスクによって実行される主な計算です。
|
protected boolean |
exec()
RecursiveActions のための実行規則を実装します。
|
Void |
getRawResult()
常に
null を返します。 |
protected void |
setRawResult(Void mustBeNull)
null 完了値が必要です。
|
adapt, adapt, adapt, cancel, complete, completeExceptionally, fork, get, get, getException, getPool, getQueuedTaskCount, getSurplusQueuedTaskCount, helpQuiesce, inForkJoinPool, invoke, invokeAll, invokeAll, invokeAll, isCancelled, isCompletedAbnormally, isCompletedNormally, isDone, join, peekNextLocalTask, pollNextLocalTask, pollTask, quietlyInvoke, quietlyJoin, reinitialize, tryUnfork
protected abstract void compute()
public final Void getRawResult()
null
を返します。getRawResult
、クラス: ForkJoinTask<Void>
null
(常時)protected final void setRawResult(Void mustBeNull)
setRawResult
、クラス: ForkJoinTask<Void>
mustBeNull
- 値protected final boolean exec()
exec
、クラス: ForkJoinTask<Void>
true
(正常に完了した場合) バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.