|
Spec-Zone .ru
спецификации, руководства, описания, API
|
public abstract class RecursiveAction extends ForkJoinTask<Void>
ForkJoinTask. Этот класс устанавливает соглашения параметризовать resultless действия как Void ForkJoinTasks. Поскольку null единственное допустимое значение типа Void, методы, такие как соединение всегда возвращаются null после завершения. Демонстрационные Использования. Вот эскиз вида ForkJoin, это сортирует данный long[] массив:
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);
}
}
} Вы могли тогда сортировать anArray создавая new SortTask(anArray, 0, anArray.length-1) и вызов этого в ForkJoinPool. Как более конкретный простой пример, следующая задача постепенно увеличивает каждый элемент массива: 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));
}
}
}
Следующий пример иллюстрирует некоторые усовершенствования и идиомы, которые могут привести к лучшей производительности: RecursiveActions не должен быть полностью рекурсивным, пока они поддерживают основной метод разобщения. Вот класс, который суммирует квадраты каждого элемента двойного массива, подразделяя только правые стороны повторных подразделений два, и отслеживая их с цепочкой 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;
}
}| Конструктор и Описание |
|---|
RecursiveAction() |
| Модификатор и Тип | Метод и Описание |
|---|---|
protected abstract void |
compute()
Основное вычисление выполняется этой задачей.
|
protected boolean |
exec()
Соглашения выполнения реализаций для RecursiveActions.
|
Пусто |
getRawResult()
Всегда возвраты
null. |
protected void |
setRawResult(Void mustBeNull)
Требует нулевого значения завершения.
|
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, tryUnforkprotected 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 и документации разработчика, см. . Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.