Condividi tramite


ForkJoinTask Classe

Definizione

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à
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 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 ForkJoinPoologgetto o, se non è già impegnato 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 è 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 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 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 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#getExceptionCancellationException#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, #helpQuiescee #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, #setRawResulte #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 Objectoggetto .

(Ereditato da Object)
Exception

Restituisce l'eccezione generata dal calcolo di base oppure un CancellationException oggetto se annullato oppure null se non è ancora stato completato 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 di base astratta per le attività eseguite all'interno di un oggetto ForkJoinPool.

(Ereditato da Object)
JniPeerMembers

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

PeerReference

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

(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 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 ForkJoinTask oggetto che esegue il metodo dell'oggetto specificato Callable come azione e restituisce il call risultato su #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 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 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 su join e le operazioni correlate.

Dispose()

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

(Ereditato da Object)
Dispose(Boolean)

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

(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 o 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 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 true se il thread corrente è in ForkJoinWorkerThread esecuzione come calcolo ForkJoinPool.

Invoke()

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

InvokeAll(ForkJoinTask, ForkJoinTask)

Esegue il fork delle attività indicate, restituendo quando isDone si tiene per ogni attività o viene rilevata un'eccezione (deselezionata), nel qual caso l'eccezione viene rigenerata.

InvokeAll(ForkJoinTask[])

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

InvokeAll(ICollection)

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

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 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 di base astratta per le attività eseguite all'interno di un oggetto ForkJoinPool.

(Ereditato da Object)
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 ForkJoinPool.

(Ereditato da Object)
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 ForkJoinPool.

(Ereditato da Object)
IJavaPeerable.DisposeUnlessReferenced()

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

(Ereditato da Object)
IJavaPeerable.Finalized()

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

(Ereditato da Object)
IJavaPeerable.JniManagedPeerState

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

(Ereditato da Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

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

(Ereditato da Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

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

(Ereditato da Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

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

(Ereditato da Object)

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 ForkJoinPool.

GetJniTypeName(IJavaPeerable)

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

GetAsync(IFuture)

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

GetAsync(IFuture, Int64, TimeUnit)

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

Si applica a