クラスRecursiveAction
java.lang.Object
java.util.concurrent.ForkJoinTask<Void>
java.util.concurrent.RecursiveAction
- すべての実装されたインタフェース:
Serializable, Future<Void>
public abstract class RecursiveAction extends ForkJoinTask<Void>
結果の出ない再帰的な
ForkJoinTask。 このクラスは、Void ForkJoinTaskのような結果の出ないアクションをパラメータ化するための規則を確立します。 nullはVoid型の唯一の有効な値であるため、joinなどのメソッドは完了時に常にnullを返します。
使用例。 ここでは、指定されたlong[]配列をソートする簡単だが完全なForkJoinソートを示します。
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));
}
}
}
次の例は、パフォーマンスを向上させる可能性のある調整や方法のいくつかを示しています。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;
}
}- 導入されたバージョン:
- 1.7
- 関連項目:
-
ネストされたクラスのサマリー
インタフェースFutureで宣言されたネストされたクラス/インタフェース
Future.State -
コンストラクタのサマリー
コンストラクタ -
メソッドのサマリー
修飾子と型メソッド説明protected abstract voidcompute()このタスクによって実行される主な計算です。protected final booleanexec()RecursiveActionsのための実行規則を実装します。final Void常にnullを返します。protected final voidsetRawResult(Void mustBeNull) null完了値が必要です。クラスで宣言されたメソッド ForkJoinTask
adapt, adapt, adapt, adaptInterruptible, adaptInterruptible, adaptInterruptible, cancel, compareAndSetForkJoinTaskTag, complete, completeExceptionally, exceptionNow, fork, get, get, getException, getForkJoinTaskTag, getPool, getQueuedTaskCount, getSurplusQueuedTaskCount, helpQuiesce, inForkJoinPool, invoke, invokeAll, invokeAll, invokeAll, isCancelled, isCompletedAbnormally, isCompletedNormally, isDone, join, peekNextLocalTask, pollNextLocalTask, pollSubmission, pollTask, quietlyComplete, quietlyInvoke, quietlyJoin, quietlyJoin, quietlyJoinUninterruptibly, reinitialize, resultNow, setForkJoinTaskTag, state, tryUnfork修飾子と型メソッド説明static ForkJoinTask<?> 指定されたRunnableのrunメソッドをアクションとして実行する新しいForkJoinTaskを返し、ForkJoinTask.join()実行時にnullの結果を返します。static <T> ForkJoinTask<T> 指定されたRunnableのrunメソッドをアクションとして実行する新しいForkJoinTaskを返し、ForkJoinTask.join()実行時に指定された結果を返します。static <T> ForkJoinTask<T> 指定されたCallableのcallメソッドをアクションとして実行する新しいForkJoinTaskを返し、その結果をForkJoinTask.join()実行時に返し、発生したチェック例外をRuntimeExceptionに変換します。static ForkJoinTask<?> adaptInterruptible(Runnable runnable) 指定されたRunnableのrunメソッドをアクションとして実行する新しいForkJoinTaskを返し、ForkJoinTask.join()でnullを返し、検出されたチェック例外をRuntimeExceptionに変換します。static <T> ForkJoinTask<T> adaptInterruptible(Runnable runnable, T result) 指定されたRunnableのrunメソッドをアクションとして実行する新しいForkJoinTaskを返し、ForkJoinTask.join()で指定した結果を返し、検出されたチェック例外をRuntimeExceptionに変換します。static <T> ForkJoinTask<T> adaptInterruptible(Callable<? extends T> callable) 指定されたCallableのcallメソッドをアクションとして実行する新しいForkJoinTaskを返し、その結果をForkJoinTask.join()実行時に返し、発生したチェック例外をRuntimeExceptionに変換します。booleancancel(boolean mayInterruptIfRunning) このタスクの実行の取消しを試みます。final booleancompareAndSetForkJoinTaskTag(short expect, short update) このタスクのタグ値を原子的に条件付きで設定します。voidこのタスクを実行し、中断または取り消しされていない場合、joinの後続の呼び出しおよび関連の操作の結果として指定された値を返します。voidこのタスクを強制的に実行し、中断または取り消しされていない場合は、joinおよび関連の操作の実行時に指定された例外がスローされます。待機せずにタスクによってスローされた例外を返します。final ForkJoinTask<Void> fork()現在のタスクが実行されているプール内でこのタスクを非同期に実行するように手配します。該当する場合は、ForkJoinTask.inForkJoinPool()を使用し、そうでない場合、ForkJoinPool.commonPool()を使用します。final Voidget()必要に応じて計算が完了するまで待機し、その後、計算結果を取得します。final Void必要に応じて、最大で指定された時間、計算が完了するまで待機し、その後、計算結果が利用可能な場合は結果を取得します。final Throwable基本計算によってスローされた例外を返します。取り消された場合はCancellationException、ない場合またはメソッドがまだ実行されていない場合はnullを返します。final shortこのタスクのタグを返します。static ForkJoinPoolgetPool()現在のスレッドをホストしているプールを返します。現在のスレッドがForkJoinPoolの外部で実行されている場合は、nullを返します。static int現在のワーカー・スレッドによってフォークされたが、まだ実行されていないタスクの推定数を返します。static int現在のワーカー・スレッドによって保持されているローカルのキューに入っているタスクが、それを横取りする可能性がある他のワーカー・スレッドよりもどれだけ多いかの推定値を返します。このスレッドがForkJoinPoolで動作していない場合はゼロを返します。static void現在のタスク「静止」をホストするプールまで、タスクが実行される可能性があります。static boolean現在のスレッドが、ForkJoinPool計算として実行されるForkJoinWorkerThreadの場合、trueを返します。final Voidinvoke()このタスクの実行を開始し、必要な場合は完了まで待機し、その結果を返すか、基本となる計算がそうである場合は、(チェックされない)RuntimeExceptionまたはErrorをスローします。static <T extends ForkJoinTask<?>>
Collection<T> invokeAll(Collection<T> tasks) 指定されたコレクション内のすべてのタスクをフォークし、各タスクに対してisDoneが適用されるか、(チェックされない)例外が発生する場合に復帰します。後者の場合、例外が再スローされます。static voidinvokeAll(ForkJoinTask<?>... tasks) 指定されたタスクをフォークし、各タスクに対してisDoneが適用されるか、(チェックされない)例外が発生する場合に復帰します。後者の場合、例外が再スローされます。static voidinvokeAll(ForkJoinTask<?> t1, ForkJoinTask<?> t2) 指定されたタスクをフォークし、各タスクに対してisDoneが適用されるか、(チェックされない)例外が発生する場合に復帰します。後者の場合、例外が再スローされます。final booleanこのタスクが正常に完了する前に取り消された場合はtrueを返します。final booleanこのタスクが例外をスローしたか取り消された場合はtrueを返します。final booleanこのタスクが例外をスローせずに完了し、取り消されなかった場合はtrueが返されます。final booleanisDone()このタスクが完了した場合はtrueを返します。final Voidjoin()「完了」の場合の計算結果を返します。protected static ForkJoinTask<?> 現在のスレッドによってキューに入れられたがまだ実行されていないタスクがすぐに使用できる場合、そのタスクを返し、スケジュール解除や実行は行いません。protected static ForkJoinTask<?> 現在のスレッドがForkJoinPoolで動作している場合に、現在のスレッドによってキューに入れられたがまだ実行されていない次のタスクを、実行せずにスケジュール解除して復帰します。protected static ForkJoinTask<?> 現在のスレッドがForkJoinPoolで動作している場合、スケジュールを解除し、実行せずに、プールに外部に送信されたタスク(使用可能な場合)を返します。protected static ForkJoinTask<?> pollTask()現在のスレッドがForkJoinPoolで動作しており、現在のスレッドによってキューに入れられたがまだ実行されていない次のタスクが使用可能な場合、そのタスクを実行せずにスケジュール解除して復帰します。そのようなタスクが使用可能でない場合は、他のスレッドによってフォークされたタスクが対象になります(使用可能な場合)。final void値を設定せずにこのタスクを正常に完了します。final voidこのタスクの実行を開始し、必要な場合は完了まで待機しますが、その結果を返したり例外をスローしたりしません。final voidこのタスクを結合し、その結果を返したり例外をスローしたりしません。final booleanquietlyJoin(long timeout, TimeUnit unit) このタスクへの参加を試みます。指定されたタイムアウトが経過し、現在のスレッドが中断されていないときに(例外的に)が完了した場合はtrueを返します。final booleanquietlyJoinUninterruptibly(long timeout, TimeUnit unit) このタスクへの参加を試みます。指定されたタイムアウトが経過する前に(例外的に)を完了した場合はtrueを返します。voidこのタスクの内部登録状態をリセットし、後続のforkを許可します。計算された結果を待たずに返します。final shortsetForkJoinTaskTag(short newValue) このタスクのタグ値を原子的に設定し、古い値を返します。state()計算状態を返します。booleanこのタスクの実行のスケジュール解除を試みます。クラスオブジェクトで宣言されたメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait修飾子と型メソッド説明protected Objectclone()このオブジェクトのコピーを作成して、返します。booleanこのオブジェクトと他のオブジェクトが等しいかどうかを示します。protected voidfinalize()削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。最終決定は非推奨であり、将来のリリースで削除される可能性があります。final Class<?> getClass()このObjectの実行時クラスを返します。inthashCode()このオブジェクトに対するハッシュ・コード値を返します。final voidnotify()このオブジェクトのモニターで待機中のスレッドを1つ再開します。final voidこのオブジェクトのモニターで待機中のすべてのスレッドを再開します。toString()オブジェクトの文字列表現を返します。final voidwait()現在のスレッドが目覚めるまで待機します。通常、notifiedまたはinterruptedです。final voidwait(long timeoutMillis) 現在のスレッドは、通常、notifiedまたはinterruptedであるか、一定のリアルタイムが経過するまで、目覚めるまで待機します。final voidwait(long timeoutMillis, int nanos) 現在のスレッドは、通常、notifiedまたはinterruptedであるか、一定のリアルタイムが経過するまで、目覚めるまで待機します。
-
コンストラクタの詳細
-
RecursiveAction
public RecursiveAction()サブクラスが呼び出すためのコンストラクタ。
-
-
メソッドの詳細
-
compute
protected abstract void compute()このタスクによって実行される主な計算です。 -
getRawResult
-
setRawResult
protected final void setRawResult(Void mustBeNull) null完了値が必要です。- 定義:
setRawResult、クラスForkJoinTask<Void>- パラメータ:
mustBeNull- 値
-
exec
protected final boolean exec()RecursiveActionsのための実行規則を実装します。- 定義:
exec、クラスForkJoinTask<Void>- 戻り値:
- このタスクが正常に完了したことがわかっている場合は
true
-