SubmissionPublisher 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.
Oggetto Flow.Publisher
che rilascia in modo asincrono gli elementi inviati (non Null) ai sottoscrittori correnti fino a quando non viene chiuso.
[Android.Runtime.Register("java/util/concurrent/SubmissionPublisher", ApiSince=33, DoNotGenerateAcw=true)]
[Java.Interop.JavaTypeParameters(new System.String[] { "T" })]
public class SubmissionPublisher : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, Java.Lang.IAutoCloseable, Java.Util.Concurrent.Flow.IPublisher
[<Android.Runtime.Register("java/util/concurrent/SubmissionPublisher", ApiSince=33, DoNotGenerateAcw=true)>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "T" })>]
type SubmissionPublisher = class
inherit Object
interface IAutoCloseable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
interface Flow.IPublisher
- Ereditarietà
- Attributi
- Implementazioni
Commenti
Oggetto Flow.Publisher
che rilascia in modo asincrono gli elementi inviati (non Null) ai sottoscrittori correnti fino a quando non viene chiuso. Ogni sottoscrittore corrente riceve gli elementi appena inviati nello stesso ordine, a meno che non vengano rilevate eccezioni o eliminazioni. L'uso di un oggetto SubmissionPublisher consente ai generatori di elementi di fungere da server di pubblicazione reattivi conformi che si basano sulla gestione delle eliminazioni e/o sul blocco per il controllo del flusso.
Un oggetto SubmissionPublisher usa l'oggetto Executor
fornito nel relativo costruttore per il recapito ai sottoscrittori. La scelta migliore dell'executor dipende dall'utilizzo previsto. Se i generatori di elementi inviati vengono eseguiti in thread separati e il numero di sottoscrittori può essere stimato, è consigliabile usare un oggetto Executors#newFixedThreadPool
. In caso contrario, è consigliabile usare l'impostazione predefinita, in genere .ForkJoinPool#commonPool
Il buffering consente ai produttori e ai consumer di operare in modo temporaneo a velocità diverse. Ogni sottoscrittore usa un buffer indipendente. I buffer vengono creati al primo utilizzo ed espansi in base alle esigenze fino al massimo specificato. La capacità applicata può essere arrotondata alla potenza più vicina di due e/o vincolata dal valore più grande supportato da questa implementazione. Le chiamate di Flow.Subscription#request(long) request
non comportano direttamente l'espansione del buffer, ma la saturazione del rischio se le richieste non soddisfatte superano la capacità massima. Il valore predefinito di può fornire un punto di Flow#defaultBufferSize()
partenza utile per scegliere una capacità in base a tariffe, risorse e utilizzi previsti.
Un singolo SubmissionPublisher può essere condiviso tra più origini. Azioni in un thread di origine prima di pubblicare un elemento o emettere un segnale <>si verificano le azioni prima</i> successive all'accesso corrispondente da ogni sottoscrittore. Tuttavia, le stime segnalate di ritardo e domanda sono progettate per l'uso nel monitoraggio, non per il controllo della sincronizzazione e possono riflettere visualizzazioni non aggiornate o imprecise dello stato di avanzamento.
I metodi di pubblicazione supportano criteri diversi sulle operazioni da eseguire quando i buffer sono saturi. Il metodo #submit(Object) submit
si blocca finché le risorse non sono disponibili. Questo è più semplice, ma meno reattivo. I offer
metodi possono eliminare gli elementi (immediatamente o con timeout delimitato), ma offrono l'opportunità di interposire un gestore e quindi riprovare.
Se un metodo del Sottoscrittore genera un'eccezione, la relativa sottoscrizione viene annullata. Se un gestore viene fornito come argomento del costruttore, viene richiamato prima dell'annullamento in caso di eccezione nel metodo Flow.Subscriber#onNext onNext
, ma le eccezioni nei metodi Flow.Subscriber#onSubscribe onSubscribe
Flow.Subscriber#onError(Throwable) onError
e Flow.Subscriber#onComplete() onComplete
non vengono registrate o gestite prima dell'annullamento. Se l'executor fornito genera RejectedExecutionException
(o qualsiasi altra eccezione RuntimeException o Error) quando si tenta di eseguire un'attività o un gestore di rilascio genera un'eccezione durante l'elaborazione di un elemento eliminato, l'eccezione viene nuovamente generata. In questi casi, non tutti i sottoscrittori saranno stati emessi l'elemento pubblicato. In questi casi è buona norma #closeExceptionally closeExceptionally
.
Il metodo #consume(Consumer)
semplifica il supporto per un caso comune in cui l'unica azione di un sottoscrittore consiste nel richiedere ed elaborare tutti gli elementi usando una funzione fornita.
Questa classe può anche fungere da base utile per le sottoclassi che generano elementi e usare i metodi in questa classe per pubblicarli. Ad esempio, ecco una classe che pubblica periodicamente gli elementi generati da un fornitore. In pratica è possibile aggiungere metodi per avviare e arrestare la generazione in modo indipendente, per condividere executor tra editori e così via o usare un SubmissionPublisher come componente anziché come superclasse.
{@code
class PeriodicPublisher<T> extends SubmissionPublisher<T> {
final ScheduledFuture<?> periodicTask;
final ScheduledExecutorService scheduler;
PeriodicPublisher(Executor executor, int maxBufferCapacity,
Supplier<? extends T> supplier,
long period, TimeUnit unit) {
super(executor, maxBufferCapacity);
scheduler = new ScheduledThreadPoolExecutor(1);
periodicTask = scheduler.scheduleAtFixedRate(
() -> submit(supplier.get()), 0, period, unit);
}
public void close() {
periodicTask.cancel(false);
scheduler.shutdown();
super.close();
}
}}
Di seguito è riportato un esempio di Flow.Processor
implementazione. Usa richieste in un unico passaggio al relativo editore per semplicità di illustrazione. Una versione più adattiva può monitorare il flusso usando la stima del ritardo restituita da submit
, insieme ad altri metodi di utilità.
{@code
class TransformProcessor<S,T> extends SubmissionPublisher<T>
implements Flow.Processor<S,T> {
final Function<? super S, ? extends T> function;
Flow.Subscription subscription;
TransformProcessor(Executor executor, int maxBufferCapacity,
Function<? super S, ? extends T> function) {
super(executor, maxBufferCapacity);
this.function = function;
}
public void onSubscribe(Flow.Subscription subscription) {
(this.subscription = subscription).request(1);
}
public void onNext(S item) {
subscription.request(1);
submit(function.apply(item));
}
public void onError(Throwable ex) { closeExceptionally(ex); }
public void onComplete() { close(); }
}}
Aggiunto in 9.
Documentazione java per java.util.concurrent.SubmissionPublisher
.
Le parti di questa pagina sono modifiche basate sul lavoro creato e condiviso dal Android e usato in base ai termini descritti in 2.5 Attribution License Creative Commons 2.5 Attribution License.
Costruttori
SubmissionPublisher() |
Crea un nuovo oggetto SubmissionPublisher usando per il |
SubmissionPublisher(IExecutor, Int32) |
Crea un nuovo oggetto SubmissionPublisher usando l'executor specificato per il recapito asincrono ai sottoscrittori, con le dimensioni massime del buffer specificate per ogni sottoscrittore e nessun gestore per le eccezioni del Sottoscrittore nel metodo |
SubmissionPublisher(IExecutor, Int32, IBiConsumer) |
Crea un nuovo oggetto SubmissionPublisher usando l'executor specificato per il recapito asincrono ai sottoscrittori, con le dimensioni massime del buffer specificate per ogni sottoscrittore e, se non Null, il gestore specificato richiamato quando un Sottoscrittore genera un'eccezione nel metodo |
SubmissionPublisher(IntPtr, JniHandleOwnership) |
Oggetto |
Proprietà
Class |
Restituisce la classe di runtime di questo |
ClosedException |
Restituisce l'eccezione associata a |
Executor |
Restituisce l'executor utilizzato per il recapito asincrono. |
Handle |
Handle per l'istanza di Android sottostante. (Ereditato da Object) |
HasSubscribers |
Restituisce true se il server di pubblicazione dispone di sottoscrittori. |
IsClosed |
Restituisce true se l'editore non accetta invii. |
JniIdentityHashCode |
Oggetto |
JniPeerMembers |
Oggetto |
MaxBufferCapacity |
Restituisce la capacità massima del buffer per sottoscrittore. |
NumberOfSubscribers |
Restituisce il numero di sottoscrittori correnti. |
PeerReference |
Oggetto |
Subscribers |
Restituisce un elenco di sottoscrittori correnti per scopi di monitoraggio e rilevamento, non per richiamare |
ThresholdClass |
Oggetto |
ThresholdType |
Oggetto |
Metodi
Clone() |
Crea e restituisce una copia di questo oggetto. (Ereditato da Object) |
Close() |
A meno che non sia già stato chiuso, genera |
CloseExceptionally(Throwable) |
A meno che non sia già stato chiuso, genera |
Consume(IConsumer) |
Elabora tutti gli elementi pubblicati usando la funzione Consumer specificata. |
Dispose() |
Oggetto |
Dispose(Boolean) |
Oggetto |
Equals(Object) |
Indica se un altro oggetto è "uguale a" questo. (Ereditato da Object) |
EstimateMaximumLag() |
Restituisce una stima del numero massimo di elementi prodotti ma non ancora utilizzati tra tutti i sottoscrittori correnti. |
EstimateMinimumDemand() |
Restituisce una stima del numero minimo di elementi richiesti (tramite |
GetHashCode() |
Restituisce un valore del codice hash per l'oggetto. (Ereditato da Object) |
IsSubscribed(Flow+ISubscriber) |
Oggetto |
JavaFinalize() |
Chiamato dal Garbage Collector su un oggetto quando Garbage Collection determina che non sono presenti altri riferimenti all'oggetto . (Ereditato da Object) |
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) |
Offer(Object, IBiPredicate) |
Pubblica l'elemento specificato, se possibile, in ogni sottoscrittore corrente richiamando in modo asincrono il relativo |
Offer(Object, Int64, TimeUnit, IBiPredicate) |
Pubblica l'elemento specificato, se possibile, in ogni sottoscrittore corrente richiamando in modo asincrono il relativo |
SetHandle(IntPtr, JniHandleOwnership) |
Imposta la proprietà Handle. (Ereditato da Object) |
Submit(Object) |
Pubblica l'elemento specificato in ogni sottoscrittore corrente richiamando in modo asincrono il relativo |
Subscribe(Flow+ISubscriber) |
Oggetto |
ToArray<T>() |
Oggetto |
ToString() |
Restituisce una rappresentazione in formato stringa dell'oggetto. (Ereditato da Object) |
UnregisterFromRuntime() |
Oggetto |
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() |
Oggetto |
IJavaPeerable.DisposeUnlessReferenced() |
Oggetto |
IJavaPeerable.Finalized() |
Oggetto |
IJavaPeerable.JniManagedPeerState |
Oggetto |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
Oggetto |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Oggetto |
IJavaPeerable.SetPeerReference(JniObjectReference) |
Oggetto |
Metodi di estensione
JavaCast<TResult>(IJavaObject) |
Esegue una conversione del tipo verificato dal runtime Android. |
JavaCast<TResult>(IJavaObject) |
Oggetto |
GetJniTypeName(IJavaPeerable) |
Oggetto |