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 di base astratta per le attività eseguite all'interno di un oggetto ForkJoinPool
.
[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 un 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 un ForkJoinPool, al prezzo di alcune limitazioni di utilizzo.
Un "main" ForkJoinTask
inizia l'esecuzione quando viene inviato in modo esplicito a un ForkJoinPool
oggetto o, se non è già impegnato 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
è 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 ad aggiungere altre attività o usare programmatori di sincronizzazione, ad esempio phaser annunciati per collaborare con la pianificazione 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 verificarsi eccezioni non controllati, che vengono rigenerate ai chiamanti che tentano di aggiungerli. Queste eccezioni possono includere anche RejectedExecutionException
l'esaurimento delle risorse interne, ad esempio l'impossibilità di allocare code di attività interne. Le eccezioni rethrown si comportano nello stesso modo delle eccezioni regolari, ma, quando possibile, contengono tracce dello stack (come mostrato ad esempio usando ex.printStackTrace()
) di entrambi i thread che hanno avviato il calcolo e il thread che effettivamente rileva 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 si blocca sulla sincronizzazione esterna o I/O. Le attività asincrone in stile evento che non vengono mai unite ( ad esempio, quelle sottoclassi CountedCompleter
) spesso rientrano in questa categoria. (2) Per ridurre al minimo l'impatto sulle risorse, le attività devono essere ridotte; idealmente 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 minore del 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 primario 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. Le forme "<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 set di attività e il join di tutti.
Negli utilizzi più comuni, una coppia fork-join agisce come una chiamata (fork) e restituisce (join) da una funzione ricorsiva parallela. Così 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 al join 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 eseguire l'esecuzione); #isCompletedNormally
è true se un'attività è stata completata senza annullare o riscontrare un'eccezione; è true se l'attività è stata annullata o rilevata un'eccezione. #isCancelled
#getException
CancellationException
#isCompletedAbnormally
in questo caso #getException
restituirà l'eccezione rilevata o CancellationException
.
La classe ForkJoinTask non è in genere direttamente sottoclassata. Al contrario, si sottoclassa una delle classi astratte che supportano uno stile specifico di elaborazione fork/join, in RecursiveAction
genere 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 usa in qualche modo 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 grafo 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 che non sono strutturati staticamente come DAG. Per supportare tali utilizzi, un ForkJoinTask può essere contrassegnato/em in modo <>atomico< con un short
valore usando #setForkJoinTaskTag
o #compareAndSetForkJoinTaskTag
e controllato usando #getForkJoinTaskTag
.> L'implementazione forkJoinTask non usa questi protected
metodi o tag per alcun scopo, ma possono essere usati nella costruzione di sottoclassi specializzate. Ad esempio, gli attraversamenti paralleli del grafo possono usare i metodi forniti per evitare di rivedere nodi/attività già elaborati. I nomi dei metodi per l'assegnazione di tag sono in parte bulk per incoraggiare la definizione di metodi che riflettono i modelli di utilizzo.
La maggior parte dei metodi di supporto di base è final
, per impedire l'override delle implementazioni intrinsecamente collegate al framework di pianificazione delle attività lightweight sottostante. Gli sviluppatori che creano nuovi stili di base di elaborazione fork/join devono implementare protected
in modo minimo i metodi #exec
, #setRawResult
e #getRawResult
, introducendo anche un metodo di calcolo astratto che può essere implementato nelle relative sottoclassi, possibilmente basandosi su altri protected
metodi forniti da questa classe.
ForkJoinTasks dovrebbe eseguire quantità relativamente piccole di calcolo. Le attività di grandi dimensioni devono essere suddivise in sottoattività più piccole, in genere tramite scomposizione ricorsiva. Come regola generale molto approssimativa, 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, l'overhead di manutenzione delle attività interne e della memoria potrebbe sovraccaricare l'elaborazione.
Questa classe fornisce adapt
metodi per Runnable
e Callable
, che possono essere utilizzati quando si combina l'esecuzione di ForkJoinTasks
con altri tipi di attività. Quando tutte le attività sono di questo modulo, è consigliabile usare un pool costruito in <em>asyncMode</em>.
ForkJoinTasks sono Serializable
, che consente di usarli in estensioni come framework di esecuzione remota. È opportuno 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 basate sul lavoro creato e condiviso dal progetto Open Source Android e usato in base ai termini descritti nella licenza Creative Commons 2.5 Attribuzione.
Costruttori
ForkJoinTask() |
Costruttore per le sottoclassi da chiamare. |
ForkJoinTask(IntPtr, JniHandleOwnership) |
Costruttore usato 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 oppure 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 di base astratta per le attività eseguite all'interno di un oggetto |
JniPeerMembers |
Classe di base astratta per le attività eseguite all'interno di un oggetto |
PeerReference |
Classe di base astratta per le attività eseguite all'interno di un oggetto |
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 rubarli o zero se questo thread non funziona in 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 atomico 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 su |
Dispose() |
Classe di base astratta per le attività eseguite all'interno di un oggetto |
Dispose(Boolean) |
Classe di base astratta per le attività eseguite all'interno di un oggetto |
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 o 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 quindi 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 non è in corso. |
InForkJoinPool() |
Restituisce |
Invoke() |
Inizia a eseguire questa attività, attende il completamento, se necessario, e restituisce il risultato oppure genera (deselezionato) |
InvokeAll(ForkJoinTask, ForkJoinTask) |
Esegue il fork delle attività indicate, restituendo quando |
InvokeAll(ForkJoinTask[]) |
Crea un fork di tutte le attività nella raccolta specificata, restituendo quando |
InvokeAll(ICollection) |
Crea un fork di 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 monitor dell'oggetto. (Ereditato da Object) |
PeekNextLocalTask() |
Restituisce, ma non annulla loschedule o non esegue, un'attività accodata dal thread corrente ma non ancora eseguita, se ne è immediatamente disponibile una. |
PollNextLocalTask() |
Annulla loschedule e restituisce, senza eseguire, l'attività successiva accodata dal thread corrente ma non ancora eseguita, se il thread corrente funziona in un ForkJoinPool. |
PollTask() |
Se il thread corrente opera in un ForkJoinPool, annulla loschedule e restituisce, senza eseguire, l'attività successiva accodata dal thread corrente ma non ancora eseguita, se disponibile, o se non disponibile, un'attività che è stata copiata 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 restituirne il risultato o generarne l'eccezione. |
QuietlyJoin() |
Aggiunge questa attività, senza restituire il risultato o generarne l'eccezione. |
Reinitialize() |
Reimposta lo stato di mantenimento della contabilità interna 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 di base astratta per le attività eseguite all'interno di un oggetto |
ToString() |
Restituisce una rappresentazione di stringa dell'oggetto. (Ereditato da Object) |
TryUnfork() |
Tenta di annullare l'impostazione di questa attività per l'esecuzione. |
UnregisterFromRuntime() |
Classe di base astratta per le attività eseguite all'interno di un oggetto |
Wait() |
Fa sì che il thread corrente attenda finché non viene risvegliato, in genere ricevendo <>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 ricevendo>< una notifica</em> o <em>interrotto</em> o fino a quando non è trascorsa una determinata quantità di tempo reale. (Ereditato da Object) |
Wait(Int64, Int32) |
Fa sì che il thread corrente attenda finché non viene risvegliato, in genere ricevendo>< una notifica</em> o <em>interrotto</em> o fino a quando non è trascorsa una determinata quantità di tempo reale. (Ereditato da Object) |
Implementazioni dell'interfaccia esplicita
IJavaPeerable.Disposed() |
Classe di base astratta per le attività eseguite all'interno di un oggetto |
IJavaPeerable.DisposeUnlessReferenced() |
Classe di base astratta per le attività eseguite all'interno di un oggetto |
IJavaPeerable.Finalized() |
Classe di base astratta per le attività eseguite all'interno di un oggetto |
IJavaPeerable.JniManagedPeerState |
Classe di base astratta per le attività eseguite all'interno di un oggetto |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
Classe di base astratta per le attività eseguite all'interno di un oggetto |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Classe di base astratta per le attività eseguite all'interno di un oggetto |
IJavaPeerable.SetPeerReference(JniObjectReference) |
Classe di base astratta per le attività eseguite all'interno di un oggetto |
Metodi di estensione
JavaCast<TResult>(IJavaObject) |
Esegue una conversione del tipo di tipo controllato dal runtime Android. |
JavaCast<TResult>(IJavaObject) |
Classe di base astratta per le attività eseguite all'interno di un oggetto |
GetJniTypeName(IJavaPeerable) |
Classe di base astratta per le attività eseguite all'interno di un oggetto |
GetAsync(IFuture) |
Classe di base astratta per le attività eseguite all'interno di un oggetto |
GetAsync(IFuture, Int64, TimeUnit) |
Classe di base astratta per le attività eseguite all'interno di un oggetto |