RecursiveAction Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Рекурсивный результат без 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> Вот простой, но полный сортировка ForkJoin, которая сортирует заданный long[] массив:
{@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++];
}
}}
Затем можно сортировать anArray , создав new SortTask(anArray) и вызвав его в ForkJoinPool. В качестве более конкретного простого примера следующая задача увеличивает каждый элемент массива:
{@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));
}
}
}}
В следующем примере показаны некоторые уточнения и идиомы, которые могут привести к повышению производительности: рекурсивные действия не должны быть полностью рекурсивными, если они поддерживают базовый подход деления и завоевания. Ниже приведен класс, который суммирует квадраты каждого элемента двойного массива, разделив только правые стороны повторяющихся разделений двумя и отслеживая их цепочкой 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.
Части этой страницы — это изменения на основе работы, созданной и общей Project и используемых в соответствии с условиями, описанными в разделе "".
Конструкторы
| Имя. | Описание |
|---|---|
| RecursiveAction() |
Конструктор для вызываемого подкласса. |
| RecursiveAction(IntPtr, JniHandleOwnership) |
Конструктор, используемый при создании управляемых представлений объектов JNI; вызывается средой выполнения. |
Свойства
| Имя. | Описание |
|---|---|
| Class |
Возвращает класс среды выполнения этого |
| Exception |
Возвращает исключение, вызываемое базовым вычислением, или если оно отменено, или |
| ForkJoinTaskTag |
Возвращает тег для этой задачи. (Унаследовано от ForkJoinTask) |
| Handle |
Дескриптор базового экземпляра Android. (Унаследовано от Object) |
| IsCancelled |
Возвращает, |
| IsCompletedAbnormally |
Возвращает, |
| IsCompletedNormally |
Возвращает, |
| IsDone |
Возвращает, |
| JniIdentityHashCode |
Возвращает хэш-код удостоверения, назначенный этому Java одноранговой среде выполнения взаимодействия. (Унаследовано от Object) |
| JniManagedPeerState |
Рекурсивный результат без |
| JniPeerMembers |
Рекурсивный результат без |
| PeerReference |
Возвращает ссылку на объект JNI для этого Java однорангового узла. (Унаследовано от Object) |
| RawRawResult |
Возвращает результат, который будет возвращен Join(), даже если эта задача завершена ненормально или |
| ThresholdClass |
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода. |
| ThresholdType |
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода. |
Методы
| Имя. | Описание |
|---|---|
| Cancel(Boolean) |
Пытается отменить выполнение этой задачи. (Унаследовано от ForkJoinTask) |
| Clone() |
Создает и возвращает копию этого объекта. (Унаследовано от Object) |
| CompareAndSetForkJoinTaskTag(Int16, Int16) |
Атомарно задает значение тега для этой задачи. (Унаследовано от ForkJoinTask) |
| Complete(Object) |
Завершает эту задачу, а если она еще не прервана или отменена, возвращает заданное значение в результате последующих вызовов |
| CompleteExceptionally(Throwable) |
Завершает эту задачу ненормально, а если она еще не прервана или отменена, вызывает исключение при |
| Compute() |
Основные вычисления, выполняемые этой задачей. |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
Рекурсивный результат без |
| Dispose() |
Освобождает ресурсы, удерживаемые этим Java одноранговым узлом. (Унаследовано от Object) |
| Dispose(Boolean) |
Освобождает ресурсы, удерживаемые этим Java одноранговым узлом. (Унаследовано от Object) |
| DisposeUnlessReferenced() |
Рекурсивный результат без |
| Equals(Object) |
Рекурсивный результат без |
| 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) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
Рекурсивный результат без |
| SetRawResult(Object) |
Принудительно возвращает заданное значение в результате. (Унаследовано от ForkJoinTask) |
| State() |
Рекурсивный результат без |
| ToArray<T>() |
Создает управляемый массив из этого Java оболочки массива. (Унаследовано от Object) |
| ToString() |
Возвращает строковое представление объекта. (Унаследовано от Object) |
| TryUnfork() |
Пытается отменить эту задачу для выполнения. (Унаследовано от ForkJoinTask) |
| UnregisterFromRuntime() |
Отменяет регистрацию этого Java однорангового узла из среды выполнения взаимодействия. (Унаследовано от Object) |
| Wait() |
Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, путем <><уведомления/>em или <эм>прерванного</em.> (Унаследовано от Object) |
| Wait(Int64, Int32) |
Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>получении уведомления</>em или <>эм прерваны< или> до тех пор, пока не истекло определенное количество реального времени. (Унаследовано от Object) |
| Wait(Int64) |
Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>получении уведомления</>em или <>эм прерваны< или> до тех пор, пока не истекло определенное количество реального времени. (Унаследовано от Object) |
Явные реализации интерфейса
| Имя. | Описание |
|---|---|
| IJavaPeerable.Disposed() |
Рекурсивный результат без |
| IJavaPeerable.Finalized() |
Рекурсивный результат без |
| IJavaPeerable.JniObjectReferenceControlBlock |
Рекурсивный результат без |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
Рекурсивный результат без |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Рекурсивный результат без |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
Рекурсивный результат без |
| IJavaPeerable.UnregisterFromRuntime() |
Рекурсивный результат без |
Методы расширения
| Имя. | Описание |
|---|---|
| GetAsync(IFuture, Int64, TimeUnit) |
Рекурсивный результат без |
| GetAsync(IFuture) |
Рекурсивный результат без |
| GetJniTypeName(IJavaPeerable) |
Возвращает имя JNI типа экземпляра |
| JavaAs<TResult>(IJavaPeerable) |
Попробуйте принуждать к типу |
| JavaCast<TResult>(IJavaObject) |
Выполняет преобразование типа, проверяемого средой выполнения Android. |
| JavaCast<TResult>(IJavaObject) |
Рекурсивный результат без |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
Попробуйте принуждать к типу |