RecursiveAction Classe
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Un résultat ForkJoinTaskrécursif .
[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
- Héritage
- Attributs
Remarques
Un résultat ForkJoinTaskrécursif . Cette classe établit des conventions pour paramétrer les actions sans résultat en tant que VoidForkJoinTasks. Étant donné qu’il null s’agit de la seule valeur valide de type Void, les méthodes telles que join toujours retourner null à la fin.
<b>Exemples d’utilisations.</b> Voici un tri ForkJoin simple mais complet qui trie un tableau donné 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++];
}
}}
Vous pouvez ensuite trier anArray en créant new SortTask(anArray) et en l’appelant dans un ForkJoinPool. Comme exemple plus concret, la tâche suivante incrémente chaque élément d’un tableau :
{@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));
}
}
}}
L’exemple suivant illustre quelques affinements et idiomes qui peuvent entraîner de meilleures performances : Les récursiveActions n’ont pas besoin d’être entièrement récursives, tant qu’elles maintiennent l’approche de base de division et de conquête. Voici une classe qui additionne les carrés de chaque élément d’un tableau double, en subdivisant uniquement les côtés droit des divisions répétées par deux, et en les faisant suivre avec une chaîne de next références. Il utilise un seuil dynamique basé sur la méthode getSurplusQueuedTaskCount, mais contrebalance le partitionnement excessif potentiel en effectuant directement des actions feuille sur des tâches non exécutées au lieu de subdivider davantage.
{@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;
}
}}
Ajouté dans la version 1.7.
Documentation Java pour java.util.concurrent.RecursiveAction.
Les parties de cette page sont des modifications basées sur le travail créé et partagé par Android Open Source et utilisées en fonction des termes décrits dans la Creative Commons 2.5 Attribution License.
Constructeurs
| Nom | Description |
|---|---|
| RecursiveAction() |
Constructeur pour les sous-classes à appeler. |
| RecursiveAction(IntPtr, JniHandleOwnership) |
Constructeur utilisé lors de la création de représentations managées d’objets JNI ; appelée par le runtime. |
Propriétés
| Nom | Description |
|---|---|
| Class |
Retourne la classe runtime de ce |
| Exception |
Retourne l’exception levée par le calcul de base, ou si |
| ForkJoinTaskTag |
Retourne la balise de cette tâche. (Hérité de ForkJoinTask) |
| Handle |
Handle de l’instance Android sous-jacente. (Hérité de Object) |
| IsCancelled |
Retourne |
| IsCompletedAbnormally |
Retourne |
| IsCompletedNormally |
Retourne |
| IsDone |
Retourne |
| JniIdentityHashCode |
Obtient le code de hachage d’identité affecté à cet homologue Java par le runtime d’interopérabilité. (Hérité de Object) |
| JniManagedPeerState |
Un résultat |
| JniPeerMembers |
Un résultat |
| PeerReference |
Obtient la référence d’objet JNI pour cet homologue Java. (Hérité de Object) |
| RawRawResult |
Retourne le résultat qui serait retourné par Join(), même si cette tâche s’est terminée anormalement ou |
| ThresholdClass |
Cette API prend en charge l’infrastructure Mono pour Android et n’est pas destinée à être utilisée directement à partir de votre code. |
| ThresholdType |
Cette API prend en charge l’infrastructure Mono pour Android et n’est pas destinée à être utilisée directement à partir de votre code. |
Méthodes
| Nom | Description |
|---|---|
| Cancel(Boolean) |
Tente d’annuler l’exécution de cette tâche. (Hérité de ForkJoinTask) |
| Clone() |
Crée et retourne une copie de cet objet. (Hérité de Object) |
| CompareAndSetForkJoinTaskTag(Int16, Int16) |
Définit de manière conditionnelle la valeur de balise de cette tâche de manière atomique. (Hérité de ForkJoinTask) |
| Complete(Object) |
Termine cette tâche et, si elle n’est pas déjà abandonnée ou annulée, retourne la valeur donnée en raison des appels suivants d’opérations |
| CompleteExceptionally(Throwable) |
Termine cette tâche anormalement et, si elle n’est pas déjà abandonnée ou annulée, elle lève l’exception donnée sur |
| Compute() |
Calcul principal effectué par cette tâche. |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
Un résultat |
| Dispose() |
Libère les ressources détenues par cet homologue Java. (Hérité de Object) |
| Dispose(Boolean) |
Libère les ressources détenues par cet homologue Java. (Hérité de Object) |
| DisposeUnlessReferenced() |
Un résultat |
| Equals(Object) |
Un résultat |
| Equals(Object) |
Indique si un autre objet est « égal à » celui-ci. (Hérité de Object) |
| ExceptionNow() |
Un résultat |
| Exec() |
Implémente des conventions d’exécution pour RecursiveActions. |
| Fork() |
Organise l’exécution asynchrone de cette tâche dans le pool dans lequel la tâche actuelle s’exécute, le cas échéant, ou en utilisant le |
| Get() |
Attend si nécessaire que le calcul se termine, puis récupère son résultat. (Hérité de ForkJoinTask) |
| Get(Int64, TimeUnit) |
Attend si nécessaire pour que le calcul soit terminé au maximum, puis récupère son résultat, le cas échéant. (Hérité de ForkJoinTask) |
| GetHashCode() |
Retourne une valeur de code de hachage pour l’objet. (Hérité de Object) |
| Invoke() |
Commence à effectuer cette tâche, attend sa fin si nécessaire et retourne son résultat, ou lève une (décochée) |
| JavaFinalize() |
Appelé par le garbage collector sur un objet lorsque le garbage collection détermine qu’il n’y a plus de références à l’objet. (Hérité de Object) |
| Join() |
Retourne le résultat du calcul lorsqu’il #isDone est terminé. (Hérité de ForkJoinTask) |
| Notify() |
Réveille un thread unique qui attend le moniteur de cet objet. (Hérité de Object) |
| NotifyAll() |
Réveille tous les threads qui attendent le moniteur de cet objet. (Hérité de Object) |
| QuietlyComplete() |
Termine cette tâche normalement sans définir de valeur. (Hérité de ForkJoinTask) |
| QuietlyInvoke() |
Commence à effectuer cette tâche et attend sa fin si nécessaire, sans retourner son résultat ou lever son exception. (Hérité de ForkJoinTask) |
| QuietlyJoin() |
Joint cette tâche, sans retourner son résultat ou lever son exception. (Hérité de ForkJoinTask) |
| QuietlyJoin(Int64, TimeUnit) |
Tente de joindre cette tâche, en retournant true si elle s’est terminée (éventuellement exceptionnellement) avant le délai d’expiration donné et que le thread actuel n’a pas été interrompu. (Hérité de ForkJoinTask) |
| QuietlyJoinUninterruptibly(Int64, TimeUnit) |
Tente de joindre cette tâche, en retournant true si elle s’est terminée (éventuellement exceptionnellement) avant le délai d’expiration donné. (Hérité de ForkJoinTask) |
| Reinitialize() |
Réinitialise l’état interne de la comptabilité de cette tâche, ce qui permet d’obtenir un résultat ultérieur |
| ResultNow() |
Un résultat |
| SetForkJoinTaskTag(Int16) |
Définit atomiquement la valeur de balise pour cette tâche et retourne l’ancienne valeur. (Hérité de ForkJoinTask) |
| SetHandle(IntPtr, JniHandleOwnership) |
Définit la propriété Handle. (Hérité de Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
Un résultat |
| SetRawResult(Object) |
Force le retour de la valeur donnée en conséquence. (Hérité de ForkJoinTask) |
| State() |
Un résultat |
| ToArray<T>() |
Crée un tableau managé à partir de ce wrapper de tableau Java. (Hérité de Object) |
| ToString() |
Retourne une représentation sous forme de chaîne de l’objet. (Hérité de Object) |
| TryUnfork() |
Tente de déplanifier cette tâche pour l’exécution. (Hérité de ForkJoinTask) |
| UnregisterFromRuntime() |
Annule l’inscription de cet homologue Java à partir du runtime d’interopérabilité. (Hérité de Object) |
| Wait() |
Provoque l’attente du thread actuel jusqu’à ce qu’il soit réveillé, généralement en étant <averti par em ou><em>interrompu</em>.<> (Hérité de Object) |
| Wait(Int64, Int32) |
Provoque l’attente du thread actuel jusqu’à ce qu’il soit réveillé, généralement en étant <averti> par< em>ou <em>interrompu/em<,> ou jusqu’à ce qu’une certaine quantité de temps réel s’est écoulée. (Hérité de Object) |
| Wait(Int64) |
Provoque l’attente du thread actuel jusqu’à ce qu’il soit réveillé, généralement en étant <averti> par< em>ou <em>interrompu/em<,> ou jusqu’à ce qu’une certaine quantité de temps réel s’est écoulée. (Hérité de Object) |
Implémentations d’interfaces explicites
| Nom | Description |
|---|---|
| IJavaPeerable.Disposed() |
Un résultat |
| IJavaPeerable.Finalized() |
Un résultat |
| IJavaPeerable.JniObjectReferenceControlBlock |
Un résultat |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
Un résultat |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Un résultat |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
Un résultat |
| IJavaPeerable.UnregisterFromRuntime() |
Un résultat |
Méthodes d’extension
| Nom | Description |
|---|---|
| GetAsync(IFuture, Int64, TimeUnit) |
Un résultat |
| GetAsync(IFuture) |
Un résultat |
| GetJniTypeName(IJavaPeerable) |
Obtient le nom JNI du type de l’instance |
| JavaAs<TResult>(IJavaPeerable) |
Essayez de forcer |
| JavaCast<TResult>(IJavaObject) |
Effectue une conversion de type vérifiée par le runtime Android. |
| JavaCast<TResult>(IJavaObject) |
Un résultat |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
Essayez de forcer |