Share via


SubmissionPublisher 類別

定義

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

[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
繼承
SubmissionPublisher
屬性
實作

備註

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。 除非遇到卸載或例外狀況,否則每個目前的訂閱者都會以相同的順序接收新送出的專案。 使用 SubmissionPublisher 可讓專案產生器做為符合規範 的回應串流 發行者,依賴置放處理和/或封鎖流程式控制制。

SubmissionPublisher 會使用 Executor 其建構函式中提供的 ,傳遞至訂閱者。 執行程式的最佳選擇取決於預期的使用量。 如果產生器 (提交專案的) 在不同的執行緒中執行,而且可以估計訂閱者的數目,請考慮使用 Executors#newFixedThreadPool 。 否則,請考慮使用預設值,通常是 ForkJoinPool#commonPool

緩衝可讓生產者和取用者暫時性地以不同的速率運作。 每個訂閱者都會使用獨立的緩衝區。 緩衝區會在第一次使用時建立,並視需要擴充到指定的最大值。 (強制執行的容量可能會四捨五入至兩個和/或受此實作所支援最大值的最接近乘冪。) 的調用 Flow.Subscription#request(long) request 不會直接造成緩衝區擴充,但如果未填滿的要求超過最大容量,則風險飽和度。 的預設值 Flow#defaultBufferSize() 可能會提供實用的起點,以根據預期的速率、資源和使用量來選擇容量。

單一提交發行者可以在多個來源之間共用。 在發佈專案之前,在來源執行緒中執行動作,或發出每個訂閱者後續對應存取的訊號 < i-before >< /i > 動作。 但回報的延遲和需求估計是設計用於監視,而不是用於同步處理控制,而且可能會反映進度的過時或不正確檢視。

發行集方法支援當緩衝區飽和時要執行哪些動作的不同原則。 方法 #submit(Object) submit 會封鎖,直到資源可用為止。 這是最簡單的,但回應最少。 方法 offer 可能會卸載專案 (立即或具有限定逾時) ,但提供插入處理常式的機會,然後再重試。

如果有任何訂閱者方法擲回例外狀況,則會取消其訂閱。 如果處理常式是以建構函式引數的形式提供,則會在方法 Flow.Subscriber#onNext onNext 中的例外狀況取消之前叫用,但在取消之前不會記錄或處理方法 Flow.Subscriber#onComplete() onCompleteFlow.Subscriber#onSubscribe onSubscribeFlow.Subscriber#onError(Throwable) onError 中的例外狀況。 如果提供的執行程式在嘗試執行工作時擲 RejectedExecutionException 回 (或任何其他 RuntimeException 或 Error) ,或卸載處理常式在處理卸載專案時擲回例外狀況,則會重新擲回例外狀況。 在這些情況下,並非所有訂閱者都會發行已發佈的專案。 在這些情況下,通常很適合 #closeExceptionally closeExceptionally 使用。

方法 #consume(Consumer) 可簡化訂閱者唯一動作使用所提供函式來要求及處理所有專案的常見案例支援。

這個類別也可以做為產生專案的子類別的便利基底,並使用這個類別中的 方法來發佈這些專案。 例如,以下是一個類別,會定期發佈從供應商產生的專案。 (實際上,您可以新增方法來獨立啟動和停止產生、在發行者之間共用執行程式等等,或使用 SubmissionPublisher 作為元件,而不是 superclass.)

{@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();
              }
            }}

以下是實作的 Flow.Processor 範例。 它會使用單一步驟要求給其發行者,以簡化圖例。 較調適型的版本可以使用 從 submit 傳回的延遲估計,以及其他公用程式方法來監視流程。

{@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(); }
            }}

已在 9 中新增。

java.util.concurrent.SubmissionPublisher JAVA 檔。

此頁面的部分是根據 原始碼專案所建立和共用的工作進行修改,並根據中所述的詞彙使用。

建構函式

SubmissionPublisher()

使用 ForkJoinPool#commonPool() 將非同步傳遞至訂閱者的新 SubmissionPublisher 建立 (除非它不支援至少兩個平行處理原則層級,在此情況下,系統會建立新的 Thread 來執行每個工作) ,且緩衝區容量 Flow#defaultBufferSize 上限為 ,且方法 Flow.Subscriber#onNext(Object) onNext 中沒有訂閱者例外狀況的處理常式。

SubmissionPublisher(IExecutor, Int32)

使用指定的 Executor 將非同步傳遞至訂閱者,為每個訂閱者建立新的 SubmissionPublisher,並針對每個訂閱者指定緩衝區大小上限,而且方法 Flow.Subscriber#onNext(Object) onNext 中沒有訂閱者例外狀況的處理常式。

SubmissionPublisher(IExecutor, Int32, IBiConsumer)

使用指定的 Executor 將非同步傳遞至訂閱者,為每個訂閱者建立新的 SubmissionPublisher,並為每個訂閱者指定緩衝區大小上限,如果不是 null,則當任何訂閱者在 方法 Flow.Subscriber#onNext(Object) onNext 中擲回例外狀況時叫用的指定處理常式。

SubmissionPublisher(IntPtr, JniHandleOwnership)

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

屬性

Class

傳回這個 Object 的執行時間類別。

(繼承來源 Object)
ClosedException

傳回與 #closeExceptionally(Throwable) closeExceptionally 相關聯的例外狀況,如果未關閉,則傳回 null,如果正常關閉則為 null。

Executor

傳回用於非同步傳遞的執行程式。

Handle

基礎 Android 實例的控制碼。

(繼承來源 Object)
HasSubscribers

如果此發行者有任何訂閱者,則傳回 true。

IsClosed

如果此發行者不接受提交,則傳回 true。

JniIdentityHashCode

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

(繼承來源 Object)
JniPeerMembers

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

MaxBufferCapacity

傳回每個訂閱者緩衝區容量上限。

NumberOfSubscribers

傳回目前訂閱者的數目。

PeerReference

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

(繼承來源 Object)
Subscribers

傳回目前訂閱者的清單以進行監視和追蹤,而不是叫 Flow.Subscriber 用訂閱者上的方法。

ThresholdClass

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

ThresholdType

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

方法

Clone()

建立並傳回這個 物件的複本。

(繼承來源 Object)
Close()

除非已經關閉,否則會發出 Flow.Subscriber#onComplete() onComplete 目前訂閱者的訊號,並不允許後續嘗試發佈。

CloseExceptionally(Throwable)

除非已經關閉,否則發出 Flow.Subscriber#onError(Throwable) onError 發出具有指定錯誤之目前訂閱者的訊號,並不允許後續嘗試發佈。

Consume(IConsumer)

使用指定的取用者函式處理所有已發佈的專案。

Dispose()

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

(繼承來源 Object)
Dispose(Boolean)

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

(繼承來源 Object)
Equals(Object)

指出其他物件是否「等於」這個物件。

(繼承來源 Object)
EstimateMaximumLag()

傳回所有目前訂閱者之間產生但尚未取用的專案數目上限的估計值。

EstimateMinimumDemand()

傳回透過) Flow.Subscription#request(long) request 但尚未在所有目前訂閱者之間產生 (要求之專案數目下限的估計值。

GetHashCode()

傳回此物件的雜湊碼值。

(繼承來源 Object)
IsSubscribed(Flow+ISubscriber)

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

JavaFinalize()

當垃圾收集判斷物件沒有其他參考時,由物件上的垃圾收集行程呼叫。

(繼承來源 Object)
Notify()

喚醒正在等候此物件的監視器的單一線程。

(繼承來源 Object)
NotifyAll()

喚醒正在等候此物件監視器的所有線程。

(繼承來源 Object)
Offer(Object, IBiPredicate)

盡可能將指定的專案發佈至每個目前的訂閱者,方法是以非同步方式叫用其 Flow.Subscriber#onNext(Object) onNext 方法。

Offer(Object, Int64, TimeUnit, IBiPredicate)

盡可能將指定的專案發佈至每個目前的訂閱者,方法是以非同步方式叫用其 Flow.Subscriber#onNext(Object) onNext 方法、封鎖任何訂用帳戶的資源無法使用、直到指定的逾時或呼叫端執行緒中斷為止,此時指定的處理常式會在叫用非 Null) 時 (,如果叫用非 Null) ,則會重試一次。

SetHandle(IntPtr, JniHandleOwnership)

設定 Handle 屬性。

(繼承來源 Object)
Submit(Object)

以非同步方式叫用其 Flow.Subscriber#onNext(Object) onNext 方法,在無法使用任何訂閱者的資源時,以非同步方式將指定的專案發佈至每個目前的訂閱者。

Subscribe(Flow+ISubscriber)

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

ToArray<T>()

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

(繼承來源 Object)
ToString()

傳回物件的字串表示。

(繼承來源 Object)
UnregisterFromRuntime()

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

(繼承來源 Object)
Wait()

讓目前的執行緒等到喚醒為止,通常是藉由 < em > notified < /em > 或 < em > interrupted < /em > 來喚醒。

(繼承來源 Object)
Wait(Int64)

讓目前的執行緒等到喚醒為止,通常是 < 透過 em > notified < /em 或 em > interrupted < /em >> ,或 < 直到經過一定數量的即時為止。

(繼承來源 Object)
Wait(Int64, Int32)

讓目前的執行緒等到喚醒為止,通常是 < 透過 em > notified < /em 或 em > interrupted < /em >> ,或 < 直到經過一定數量的即時為止。

(繼承來源 Object)

明確介面實作

IJavaPeerable.Disposed()

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

(繼承來源 Object)
IJavaPeerable.DisposeUnlessReferenced()

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

(繼承來源 Object)
IJavaPeerable.Finalized()

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

(繼承來源 Object)
IJavaPeerable.JniManagedPeerState

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

(繼承來源 Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

(繼承來源 Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

(繼承來源 Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

(繼承來源 Object)

擴充方法

JavaCast<TResult>(IJavaObject)

執行 Android 執行時間檢查的類型轉換。

JavaCast<TResult>(IJavaObject)

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

GetJniTypeName(IJavaPeerable)

,非同步 Flow.Publisher 發出 (非 Null) 專案給目前訂閱者,直到關閉為止。

適用於