Condividi tramite


ForkJoinTask Classe

Definizione

Classe base astratta per le attività eseguite all'interno di un ForkJoinPoologgetto .

[Android.Runtime.Register("java/util/concurrent/ForkJoinTask", DoNotGenerateAcw=true)]
[Java.Interop.JavaTypeParameters(new System.String[] { "V" })]
public abstract class ForkJoinTask : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, Java.IO.ISerializable, Java.Util.Concurrent.IFuture
[<Android.Runtime.Register("java/util/concurrent/ForkJoinTask", DoNotGenerateAcw=true)>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "V" })>]
type ForkJoinTask = class
    inherit Object
    interface ISerializable
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
    interface IFuture
Ereditarietà
ForkJoinTask
Derivato
Attributi
Implementazioni

Commenti

Classe di base astratta per le attività eseguite all'interno di un oggetto ForkJoinPool. Un ForkJoinTask è un'entità simile a thread molto più leggera rispetto a un thread normale. Un numero elevato di attività e sottoattività può essere ospitato da un numero ridotto di thread effettivi in forkJoinPool, a prezzo di alcune limitazioni di utilizzo.

Un oggetto "main" ForkJoinTask inizia l'esecuzione quando viene inviato in modo esplicito a un ForkJoinPoologgetto oppure, se non è già stato eseguito in un calcolo ForkJoin, avviato nei ForkJoinPool#commonPool() metodi correlati tramite #fork, #invokeo . Una volta avviato, in genere avvierà altre sottoattività. Come indicato dal nome di questa classe, molti programmi che usano ForkJoinTask solo metodi #fork e #join, o derivati come #invokeAll(ForkJoinTask...) invokeAll. Tuttavia, questa classe fornisce anche diversi altri metodi che possono entrare in gioco in utilizzi avanzati, nonché meccanismi di estensione che consentono il supporto di nuove forme di elaborazione fork/join.

Un ForkJoinTask oggetto è una forma leggera di Future. L'efficienza di ForkJoinTasks deriva da un set di restrizioni (che sono solo parzialmente applicabili in modo statico) riflettendo il loro uso principale come attività di calcolo che calcolano funzioni pure o operano su oggetti puramente isolati. I meccanismi di coordinamento principali sono #fork, che dispone l'esecuzione asincrona e #join, che non procede fino a quando non viene calcolato il risultato dell'attività. I calcoli devono idealmente evitare synchronized metodi o blocchi e ridurre al minimo altre sincronizzazioni bloccanti oltre a unire altre attività o a usare programmatori come Phaser annunciati per collaborare con la pianificazione di fork/join. Le attività suddivisioni non devono inoltre eseguire operazioni di I/O bloccabili e devono accedere idealmente alle variabili completamente indipendenti da quelle a cui accedono altre attività in esecuzione. Queste linee guida vengono applicate in modo libero non consentendo eccezioni controllate, IOExceptions ad esempio per essere generate. Tuttavia, i calcoli possono comunque riscontrare eccezioni deselezionate, che vengono rigenerate ai chiamanti che tentano di aggiungerli. Queste eccezioni possono includere RejectedExecutionException anche l'esaurimento delle risorse interne, ad esempio l'errore di allocare code di attività interne. Le eccezioni di tipo Rethrown si comportano nello stesso modo delle eccezioni regolari, ma, quando possibile, contengono le tracce dello stack (come illustrato ad esempio usando ex.printStackTrace()) del thread che ha avviato il calcolo e il thread che effettivamente riscontra l'eccezione; in minima parte solo quest'ultimo.

È possibile definire e usare ForkJoinTasks che può bloccarsi, ma in questo modo sono necessarie altre tre considerazioni: (1) Completamento di pochi se qualsiasi <attività< em>/em> deve dipendere da un'attività che blocca la sincronizzazione esterna o L/O. Le attività asincrone in stile evento che non vengono mai unite (ad esempio, quelle sottoclassi CountedCompleter) rientrano spesso in questa categoria. (2) Per ridurre al minimo l'impatto sulle risorse, le attività devono essere ridotte; idealmente eseguendo solo l'azione di blocco (possibilmente). (3) A meno che non venga usata l'API ForkJoinPool.ManagedBlocker o il numero di attività eventualmente bloccate sia inferiore al livello del ForkJoinPool#getParallelism pool, il pool non può garantire che siano disponibili thread sufficienti per garantire lo stato di avanzamento o prestazioni ottimali.

Il metodo principale per l'attesa del completamento e l'estrazione dei risultati di un'attività è #join, ma esistono diverse varianti: i Future#get metodi supportano attese interrompibili e/o timed per il completamento e i risultati del report usando Future le convenzioni. Il metodo #invoke è semanticamente equivalente a fork(); join() ma tenta sempre di iniziare l'esecuzione nel thread corrente. I moduli "<em>quiet</em>" di questi metodi non estraggono risultati o segnalano eccezioni. Questi possono essere utili quando viene eseguito un set di attività ed è necessario ritardare l'elaborazione dei risultati o delle eccezioni fino al completamento di tutti. Il metodo invokeAll (disponibile in più versioni) esegue la forma più comune di chiamata parallela: la creazione di un fork di un set di attività e l'unione di tutti.

Negli utilizzi più comuni, una coppia fork-join agisce come una chiamata (fork) e restituisce (join) da una funzione ricorsiva parallela. Come avviene con altre forme di chiamate ricorsive, i valori restituiti (join) devono essere eseguiti all'interno più interno. Ad esempio, a.fork(); b.fork(); b.join(); a.join(); è probabile che sia sostanzialmente più efficiente rispetto all'unione a prima bdi .

Lo stato di esecuzione delle attività può essere sottoposto a query a diversi livelli di dettaglio: #isDone è true se un'attività è stata completata in qualsiasi modo (incluso il caso in cui un'attività è stata annullata senza l'esecuzione); #isCompletedNormally è true se un'attività è stata completata senza annullare o riscontrare un'eccezione; #isCancelled è true se l'attività è stata annullata (nel qual caso #getException restituisce un oggetto CancellationException). e #isCompletedAbnormally è true se un'attività è stata annullata o ha rilevato un'eccezione. in questo caso #getException restituirà l'eccezione rilevata o CancellationException.

La classe ForkJoinTask non è in genere sottoclassata direttamente. Al contrario, si sottoclassa una delle classi astratte che supportano uno stile specifico di elaborazione fork/join, in genere RecursiveAction per la maggior parte dei calcoli che non restituiscono risultati, RecursiveTask per quelle che eseguono e CountedCompleter per quelle in cui le azioni completate attivano altre azioni. In genere, una sottoclasse ForkJoinTask concreta dichiara i campi che comprendono i relativi parametri, stabiliti in un costruttore e quindi definisce un compute metodo che in qualche modo usa i metodi di controllo forniti da questa classe di base.

Il metodo #join e le relative varianti sono appropriati per l'uso solo quando le dipendenze di completamento sono acicliche, ovvero il calcolo parallelo può essere descritto come grafico aciclico diretto (DAG). In caso contrario, le esecuzioni possono incontrare una forma di deadlock perché le attività attendono ciclicamente l'una l'altra. Tuttavia, questo framework supporta altri metodi e tecniche (ad esempio l'uso di Phaser, #helpQuiescee #complete) che possono essere usati per costruire sottoclassi personalizzate per problemi non strutturati in modo statico come DAG. Per supportare tali usi, un ForkJoinTask può essere con tag/em atomicamente <em>con un short valore usando o #compareAndSetForkJoinTaskTag e controllato usando #setForkJoinTaskTag#getForkJoinTaskTag.>< L'implementazione forkJoinTask non usa questi protected metodi o tag per qualsiasi scopo, ma possono essere usati nella costruzione di sottoclassi specializzate. Ad esempio, gli attraversamenti di grafo parallelo possono usare i metodi forniti per evitare di rivedere nodi/attività già elaborati. I nomi dei metodi per l'assegnazione di tag sono in blocco in parte per incoraggiare la definizione dei metodi che riflettono i modelli di utilizzo.

La maggior parte dei metodi di supporto di base è final, per evitare l'override delle implementazioni intrinsecamente associate al framework di pianificazione delle attività leggero sottostante. Gli sviluppatori che creano nuovi stili di base di elaborazione fork/join devono implementare protected minimamente metodi #exec, #setRawResulte #getRawResult, introducendo anche un metodo di calcolo astratto che può essere implementato nelle relative sottoclassi, eventualmente basandosi su altri protected metodi forniti da questa classe.

ForkJoinTasks deve eseguire quantità relativamente piccole di calcolo. Le attività di grandi dimensioni devono essere suddivise in sottotask più piccole, in genere tramite scomposizione ricorsiva. Come regola molto approssimativa di pollice, un'attività deve eseguire più di 100 e meno di 10000 passaggi di calcolo di base e dovrebbe evitare cicli indefiniti. Se le attività sono troppo grandi, il parallelismo non può migliorare la velocità effettiva. Se troppo piccolo, il sovraccarico della manutenzione delle attività e della memoria interna potrebbe sovraccaricare l'elaborazione.

Questa classe fornisce adapt metodi per Runnable e Callable, che possono essere di uso durante la combinazione di esecuzione di ForkJoinTasks con altri tipi di attività. Quando tutte le attività sono di questo modulo, prendere in considerazione l'uso di un pool costruito in <em>asyncMode</em>.

ForkJoinTasks è Serializable, che consente di usarli nelle estensioni, ad esempio framework di esecuzione remoti. È consigliabile serializzare le attività solo prima o dopo, ma non durante l'esecuzione. La serializzazione non si basa su durante l'esecuzione stessa.

Aggiunta nella versione 1.7.

Documentazione Java per java.util.concurrent.ForkJoinTask.

Le parti di questa pagina sono modifiche in base al lavoro creato e condiviso dal Android Open Source e usato in base ai termini descritti nella .

Costruttori

ForkJoinTask()

Costruttore per le sottoclassi da chiamare.

ForkJoinTask(IntPtr, JniHandleOwnership)

Costruttore utilizzato durante la creazione di rappresentazioni gestite di oggetti JNI; chiamato dal runtime.

Proprietà

Class

Restituisce la classe di runtime di questo Objectoggetto .

(Ereditato da Object)
Exception

Restituisce l'eccezione generata dal calcolo di base o da un CancellationException oggetto se annullato oppure null se nessuno o se il metodo non è ancora stato completato.

ForkJoinTaskTag

Restituisce il tag per questa attività.

Handle

Handle per l'istanza di Android sottostante.

(Ereditato da Object)
IsCancelled

Restituisce true se l'attività è stata annullata prima del completamento normale.

IsCompletedAbnormally

Restituisce true se l'attività ha generato un'eccezione o è stata annullata.

IsCompletedNormally

Restituisce true se l'attività è stata completata senza generare un'eccezione e non è stata annullata.

IsDone

Restituisce true se l'attività è stata completata.

JniIdentityHashCode

Classe base astratta per le attività eseguite all'interno di un ForkJoinPoologgetto .

(Ereditato da Object)
JniPeerMembers

Classe base astratta per le attività eseguite all'interno di un ForkJoinPoologgetto .

PeerReference

Classe base astratta per le attività eseguite all'interno di un ForkJoinPoologgetto .

(Ereditato da Object)
Pool

Restituisce il pool che ospita il thread corrente o null se il thread corrente è in esecuzione all'esterno di qualsiasi ForkJoinPool.

QueuedTaskCount

Restituisce una stima del numero di attività copiate tramite fork dal thread di lavoro corrente ma non ancora eseguite.

RawRawResult

Restituisce il risultato che verrebbe restituito da Join(), anche se questa attività è stata completata in modo anomalo o null se questa attività non è nota per essere stata completata.

SurplusQueuedTaskCount

Restituisce una stima del numero di attività in coda in locale mantenute dal thread di lavoro corrente rispetto ad altri thread di lavoro che potrebbero rubarle o zero se questo thread non funziona in un forkJoinPool.

ThresholdClass

Questa API supporta l'infrastruttura Mono per Android e non deve essere usata direttamente dal codice.

ThresholdType

Questa API supporta l'infrastruttura Mono per Android e non deve essere usata direttamente dal codice.

Metodi

Adapt(ICallable)

Restituisce un nuovo ForkJoinTask oggetto che esegue il call metodo dell'oggetto specificato Callable come azione e restituisce il risultato dopo #join, convertendo eventuali eccezioni controllate rilevate in RuntimeException.

Adapt(IRunnable)

Restituisce un nuovo ForkJoinTask oggetto che esegue il run metodo dell'oggetto specificato Runnable come azione e restituisce un risultato Null su #join.

Adapt(IRunnable, Object)

Restituisce un nuovo ForkJoinTask oggetto che esegue il run metodo dell'oggetto specificato Runnable come azione e restituisce il risultato specificato su #join.

Cancel(Boolean)

Tenta di annullare l'esecuzione di questa attività.

Clone()

Crea e restituisce una copia di questo oggetto.

(Ereditato da Object)
CompareAndSetForkJoinTaskTag(Int16, Int16)

Imposta in modo condizionale il valore del tag per questa attività.

Complete(Object)

Completa questa attività e, se non è già stata interrotta o annullata, restituendo il valore specificato come risultato delle chiamate successive di join e delle operazioni correlate.

CompleteExceptionally(Throwable)

Completa questa attività in modo anomalo e, se non è già stata interrotta o annullata, genera l'eccezione specificata in caso join di operazioni correlate e .

Dispose()

Classe base astratta per le attività eseguite all'interno di un ForkJoinPoologgetto .

(Ereditato da Object)
Dispose(Boolean)

Classe base astratta per le attività eseguite all'interno di un ForkJoinPoologgetto .

(Ereditato da Object)
Equals(Object)

Indica se un altro oggetto è "uguale a" questo.

(Ereditato da Object)
Exec()

Esegue immediatamente l'azione di base di questa attività e restituisce true se, al ritorno da questo metodo, questa attività è garantita che sia stata completata.

Fork()

Dispone di eseguire questa attività in modo asincrono nel pool in cui è in esecuzione l'attività corrente, se applicabile, oppure utilizzando se ForkJoinPool#commonPool() non #inForkJoinPool.

Get()

Attende se necessario il completamento del calcolo e quindi recupera il risultato.

Get(Int64, TimeUnit)

Attende se necessario per il completamento del calcolo al massimo il tempo specificato e recupera il risultato, se disponibile.

GetHashCode()

Restituisce un valore del codice hash per l'oggetto.

(Ereditato da Object)
HelpQuiesce()

È possibile eseguire attività fino a quando il pool che ospita l'attività corrente ForkJoinPool#isQuiescent è quiescent.

InForkJoinPool()

Restituisce true se il thread corrente è un ForkJoinWorkerThread oggetto in esecuzione come calcolo ForkJoinPool.

Invoke()

Inizia a eseguire questa attività, attende il completamento, se necessario, e restituisce il risultato o genera un'eccezione (deselezionata) RuntimeException o Error se il calcolo sottostante lo ha fatto.

InvokeAll(ForkJoinTask, ForkJoinTask)

Crea un fork per le attività specifiche, restituendo quando isDone viene bloccato per ogni attività o viene rilevata un'eccezione (deselezionata), nel qual caso viene generata nuovamente l'eccezione.

InvokeAll(ForkJoinTask[])

Fork tutte le attività nella raccolta specificata, restituendo quando isDone si tiene per ogni attività o viene rilevata un'eccezione (deselezionata), nel qual caso viene generata nuovamente l'eccezione.

InvokeAll(ICollection)

Fork tutte le attività nella raccolta specificata, restituendo quando isDone si tiene per ogni attività o viene rilevata un'eccezione (deselezionata), nel qual caso viene generata nuovamente l'eccezione.

JavaFinalize()

Chiamato dal Garbage Collector su un oggetto quando Garbage Collection determina che non sono presenti altri riferimenti all'oggetto .

(Ereditato da Object)
Join()

Restituisce il risultato del calcolo al termine della #isDone.

Notify()

Riattiva un singolo thread in attesa del monitor dell'oggetto.

(Ereditato da Object)
NotifyAll()

Riattiva tutti i thread in attesa del monitoraggio di questo oggetto.

(Ereditato da Object)
PeekNextLocalTask()

Restituisce, ma non esegue loschedule o l'esecuzione, un'attività accodata dal thread corrente ma non ancora eseguita, se ne è immediatamente disponibile uno.

PollNextLocalTask()

Annulla leschedule e restituisce, senza eseguire, l'attività successiva accodata dal thread corrente ma non ancora eseguita, se il thread corrente opera in un ForkJoinPool.

PollTask()

Se il thread corrente opera in un forkJoinPool, annulla la struttura e restituisce, senza eseguire, l'attività successiva accodata dal thread corrente ma non ancora eseguita, se disponibile, o se non è disponibile, un'attività creata tramite fork da un altro thread, se disponibile.

QuietlyComplete()

Completa questa attività normalmente senza impostare un valore.

QuietlyInvoke()

Inizia a eseguire questa attività e attende il completamento, se necessario, senza restituire il risultato o generare l'eccezione.

QuietlyJoin()

Aggiunge questa attività, senza restituire il risultato o generare l'eccezione.

Reinitialize()

Reimposta lo stato di conservazione interno di questa attività, consentendo un successivo fork.

SetForkJoinTaskTag(Int16)

Imposta in modo atomico il valore del tag per questa attività e restituisce il valore precedente.

SetHandle(IntPtr, JniHandleOwnership)

Imposta la proprietà Handle.

(Ereditato da Object)
SetRawResult(Object)

Forza la restituzione del valore specificato come risultato.

ToArray<T>()

Classe base astratta per le attività eseguite all'interno di un ForkJoinPoologgetto .

(Ereditato da Object)
ToString()

Restituisce una rappresentazione in formato stringa dell'oggetto.

(Ereditato da Object)
TryUnfork()

Tenta di annullare l'impostazione di questa attività per l'esecuzione.

UnregisterFromRuntime()

Classe base astratta per le attività eseguite all'interno di un ForkJoinPoologgetto .

(Ereditato da Object)
Wait()

Fa sì che il thread corrente attenda finché non viene risvegliato, in genere eseguendo <una>notifica</em> o <em>interrotto</em>.

(Ereditato da Object)
Wait(Int64)

Fa sì che il thread corrente attenda finché non viene risvegliato, in genere eseguendo <una notifica</>em> o <em>interrotto</em> o fino a quando non è trascorsa una certa quantità di tempo reale.

(Ereditato da Object)
Wait(Int64, Int32)

Fa sì che il thread corrente attenda finché non viene risvegliato, in genere eseguendo <una notifica</>em> o <em>interrotto</em> o fino a quando non è trascorsa una certa quantità di tempo reale.

(Ereditato da Object)

Implementazioni dell'interfaccia esplicita

IJavaPeerable.Disposed()

Classe base astratta per le attività eseguite all'interno di un ForkJoinPoologgetto .

(Ereditato da Object)
IJavaPeerable.DisposeUnlessReferenced()

Classe base astratta per le attività eseguite all'interno di un ForkJoinPoologgetto .

(Ereditato da Object)
IJavaPeerable.Finalized()

Classe base astratta per le attività eseguite all'interno di un ForkJoinPoologgetto .

(Ereditato da Object)
IJavaPeerable.JniManagedPeerState

Classe base astratta per le attività eseguite all'interno di un ForkJoinPoologgetto .

(Ereditato da Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Classe base astratta per le attività eseguite all'interno di un ForkJoinPoologgetto .

(Ereditato da Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Classe base astratta per le attività eseguite all'interno di un ForkJoinPoologgetto .

(Ereditato da Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

Classe base astratta per le attività eseguite all'interno di un ForkJoinPoologgetto .

(Ereditato da Object)

Metodi di estensione

JavaCast<TResult>(IJavaObject)

Esegue una conversione del tipo verificato dal runtime Android.

JavaCast<TResult>(IJavaObject)

Classe base astratta per le attività eseguite all'interno di un ForkJoinPoologgetto .

GetJniTypeName(IJavaPeerable)

Classe base astratta per le attività eseguite all'interno di un ForkJoinPoologgetto .

GetAsync(IFuture)

Classe base astratta per le attività eseguite all'interno di un ForkJoinPoologgetto .

GetAsync(IFuture, Int64, TimeUnit)

Classe base astratta per le attività eseguite all'interno di un ForkJoinPoologgetto .

Si applica a