ForkJoinTask Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Classe base astratta per le attività eseguite all'interno di un ForkJoinPool
oggetto .
[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à
- 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 ForkJoinPool
oggetto oppure, se non è già stato eseguito in un calcolo ForkJoin, avviato nei ForkJoinPool#commonPool()
metodi correlati tramite #fork
, #invoke
o . 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 ForkJoinTask
s 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 b
di .
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
, #helpQuiesce
e #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
, #setRawResult
e #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 |
Exception |
Restituisce l'eccezione generata dal calcolo di base o da un |
ForkJoinTaskTag |
Restituisce il tag per questa attività. |
Handle |
Handle per l'istanza di Android sottostante. (Ereditato da Object) |
IsCancelled |
Restituisce |
IsCompletedAbnormally |
Restituisce |
IsCompletedNormally |
Restituisce |
IsDone |
Restituisce |
JniIdentityHashCode |
Classe base astratta per le attività eseguite all'interno di un |
JniPeerMembers |
Classe base astratta per le attività eseguite all'interno di un |
PeerReference |
Classe base astratta per le attività eseguite all'interno di un |
Pool |
Restituisce il pool che ospita il thread corrente o |
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 |
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 |
Adapt(IRunnable) |
Restituisce un nuovo |
Adapt(IRunnable, Object) |
Restituisce un nuovo |
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 |
CompleteExceptionally(Throwable) |
Completa questa attività in modo anomalo e, se non è già stata interrotta o annullata, genera l'eccezione specificata in caso |
Dispose() |
Classe base astratta per le attività eseguite all'interno di un |
Dispose(Boolean) |
Classe base astratta per le attività eseguite all'interno di un |
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 |
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 |
Invoke() |
Inizia a eseguire questa attività, attende il completamento, se necessario, e restituisce il risultato o genera un'eccezione (deselezionata) |
InvokeAll(ForkJoinTask, ForkJoinTask) |
Crea un fork per le attività specifiche, restituendo quando |
InvokeAll(ForkJoinTask[]) |
Fork tutte le attività nella raccolta specificata, restituendo quando |
InvokeAll(ICollection) |
Fork tutte le attività nella raccolta specificata, restituendo quando |
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 |
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 |
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 |
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 |
IJavaPeerable.DisposeUnlessReferenced() |
Classe base astratta per le attività eseguite all'interno di un |
IJavaPeerable.Finalized() |
Classe base astratta per le attività eseguite all'interno di un |
IJavaPeerable.JniManagedPeerState |
Classe base astratta per le attività eseguite all'interno di un |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
Classe base astratta per le attività eseguite all'interno di un |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Classe base astratta per le attività eseguite all'interno di un |
IJavaPeerable.SetPeerReference(JniObjectReference) |
Classe base astratta per le attività eseguite all'interno di un |
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 |
GetJniTypeName(IJavaPeerable) |
Classe base astratta per le attività eseguite all'interno di un |
GetAsync(IFuture) |
Classe base astratta per le attività eseguite all'interno di un |
GetAsync(IFuture, Int64, TimeUnit) |
Classe base astratta per le attività eseguite all'interno di un |