Language

SubmissionPublisher クラス

定義

現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する Flow.Publisher 。

[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.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
属性
実装

注釈

現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する Flow.Publisher 。 ドロップまたは例外が発生しない限り、現在の各サブスクライバーは同じ順序で新しく送信されたアイテムを受け取ります。 SubmissionPublisher を使用すると、項目ジェネレーターは、フロー制御のドロップ処理やブロックに依存する準拠 のリアクティブ ストリーム パブリッシャーとして機能できます。

SubmissionPublisher は、サブスクライバーに配信するためにコンストラクターで提供される Executor を使用します。 Executor の最適な選択は、予想される使用方法によって異なります。 送信された項目のジェネレーターが別々のスレッドで実行され、サブスクライバーの数を見積もることができる場合は、 Executors#newFixedThreadPoolの使用を検討してください。 それ以外の場合は、既定値 (通常は ForkJoinPool#commonPool) の使用を検討してください。

バッファリングにより、プロデューサーとコンシューマーは異なるレートで一時的に動作できます。 各サブスクライバーは、独立したバッファーを使用します。 バッファーは最初の使用時に作成され、必要に応じて指定された最大値まで拡張されます。 (適用される容量は、2 の最も近い累乗に切り上げたり、この実装でサポートされている最大値によって制限されたりすることがあります)。 Flow.Subscription#request(long) request の呼び出しによってバッファーが拡張されるわけではありませんが、満たされていない要求が最大容量を超えた場合は、飽和するリスクがあります。 Flow#defaultBufferSize()の既定値は、予想されるレート、リソース、使用状況に基づいて容量を選択するための便利な開始点となる場合があります。

1 つの SubmissionPublisher を複数のソース間で共有できます。 アイテムを発行する前、またはシグナル <i>happen-before</i> を発行する前のソース スレッドのアクション。各サブスクライバーによる対応するアクセスに続くアクション。 ただし、報告されたラグと需要の見積もりは、同期制御ではなく監視で使用するように設計されており、古いビューや不正確な進行状況を反映している可能性があります。

パブリケーション メソッドは、バッファーが飽和状態になったときの処理に関するさまざまなポリシーをサポートします。 メソッド #submit(Object) submit は、リソースが使用可能になるまでブロックします。 これは最も単純ですが、応答性は最も低くなります。 offerメソッドは、項目を (直ちにまたは境界付きタイムアウトで) ドロップできますが、ハンドラーをインターポーズしてから再試行する機会を提供します。

サブスクライバー メソッドが例外をスローした場合、そのサブスクリプションは取り消されます。 ハンドラーがコンストラクター引数として指定されている場合は、メソッド Flow.Subscriber#onNext onNextの例外時に取り消しの前に呼び出されますが、メソッド Flow.Subscriber#onSubscribe onSubscribe、 Flow.Subscriber#onError(Throwable) onError 、 Flow.Subscriber#onComplete() onComplete の例外は、取り消し前に記録または処理されません。 指定された Executor がタスクの実行時に RejectedExecutionException (またはその他の RuntimeException または Error) をスローした場合、またはドロップ ハンドラーがドロップされたアイテムの処理中に例外をスローした場合、例外は再スローされます。 このような場合、すべてのサブスクライバーが発行されたわけではありません。 通常、このような場合は #closeExceptionally closeExceptionally することをお勧めします。

メソッド #consume(Consumer) では、サブスクライバーの唯一のアクションは、指定された関数を使用してすべての項目を要求して処理する一般的なケースのサポートを簡略化します。

このクラスは、項目を生成するサブクラスの便利なベースとして機能し、このクラスのメソッドを使用してそれらを発行することもできます。 たとえば、サプライヤーから生成されたアイテムを定期的に発行するクラスを次に示します。 (実際には、生成を個別に開始および停止するメソッド、パブリッシャー間で Executor を共有するメソッド、またはスーパークラスではなくコンポーネントとして SubmissionPublisher を使用するメソッドを追加できます)。

{@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ドキュメント。

このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。

コンストラクター

名前 説明
SubmissionPublisher()

サブスクライバーへの非同期配信の ForkJoinPool#commonPool() を使用して新しい SubmissionPublisher を作成します (少なくとも 2 つの並列処理レベルをサポートしていない場合は、各タスクを実行する新しいスレッドが作成されます)。この場合、最大バッファー容量は Flow#defaultBufferSize で、メソッド Flow.Subscriber#onNext(Object) onNextのサブスクライバー例外のハンドラーは作成されません。

SubmissionPublisher(IExecutor, Int32, IBiConsumer)

サブスクライバーへの非同期配信用に指定された Executor を使用して新しい SubmissionPublisher を作成し、各サブスクライバーの最大バッファー サイズを指定し、null 以外の場合は、サブスクライバーがメソッド Flow.Subscriber#onNext(Object) onNextで例外をスローしたときに呼び出される特定のハンドラーを作成します。

SubmissionPublisher(IExecutor, Int32)

サブスクライバーへの非同期配信用に指定された Executor を使用して新しい SubmissionPublisher を作成し、各サブスクライバーに対して指定された最大バッファー サイズを指定し、メソッド Flow.Subscriber#onNext(Object) onNextのサブスクライバー例外のハンドラーを作成しません。

SubmissionPublisher(IntPtr, JniHandleOwnership)

現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する Flow.Publisher 。

プロパティ

名前 説明
Class

この Objectのランタイム クラスを返します。

(継承元 Object)
ClosedException

#closeExceptionally(Throwable) closeExceptionallyに関連付けられている例外を返します。閉じていない場合、または正常に閉じている場合は null を返します。

Executor

非同期配信に使用される Executor を返します。

Handle

基になる Android インスタンスへのハンドル。

(継承元 Object)
HasSubscribers

このパブリッシャーにサブスクライバーがある場合は true を返します。

IsClosed

この発行元が申請を受け入れられない場合は true を返します。

JniIdentityHashCode

相互運用ランタイムによってこのJava ピアに割り当てられた ID ハッシュ コードを取得します。

(継承元 Object)
JniManagedPeerState

現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する Flow.Publisher 。

(継承元 JavaObject)
JniPeerMembers

現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する Flow.Publisher 。

MaxBufferCapacity

サブスクライバーごとの最大バッファー容量を返します。

NumberOfSubscribers

現在のサブスクライバーの数を返します。

PeerReference

このJava ピアの JNI オブジェクト参照を取得します。

(継承元 Object)
Subscribers

サブスクライバーで Flow.Subscriber メソッドを呼び出すのではなく、監視と追跡の目的で現在のサブスクライバーの一覧を返します。

ThresholdClass

現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する Flow.Publisher 。

ThresholdType

現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する Flow.Publisher 。

メソッド

名前 説明
Clone()

このオブジェクトのコピーを作成して返します。

(継承元 Object)
Close()

既に閉じていなければ、問題 Flow.Subscriber#onComplete() onComplete 現在のサブスクライバーに通知され、以降の発行の試行が禁止されます。

CloseExceptionally(Throwable)

既に閉じていなければ、問題 Flow.Subscriber#onError(Throwable) onError 特定のエラーで現在のサブスクライバーに通知され、それ以降の発行の試行は禁止されます。

Construct(JniObjectReference, JniObjectReferenceOptions)

現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する Flow.Publisher 。

(継承元 JavaObject)
Consume(IConsumer)

指定されたコンシューマー関数を使用して、発行されたすべてのアイテムを処理します。

Dispose()

このJava ピアによって保持されているリソースを解放します。

(継承元 Object)
Dispose(Boolean)

このJava ピアによって保持されているリソースを解放します。

(継承元 Object)
DisposeUnlessReferenced()

現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する Flow.Publisher 。

(継承元 JavaObject)
Equals(Object)

現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する Flow.Publisher 。

(継承元 JavaObject)
Equals(Object)

他のオブジェクトがこのオブジェクトと "等しい" かどうかを示します。

(継承元 Object)
EstimateMaximumLag()

現在のすべてのサブスクライバー間で生成されたが、まだ消費されていない項目の最大数の推定値を返します。

EstimateMinimumDemand()

すべての現在のサブスクライバー間で要求された ( Flow.Subscription#request(long) request経由で) まだ生成されていない項目の最小数の見積もりを返します。

GetHashCode()

オブジェクトのハッシュ コード値を返します。

(継承元 Object)
IsSubscribed(Flow+ISubscriber)

指定されたサブスクライバーが現在サブスクライブしている場合は true を返します。

JavaFinalize()
古い.

オブジェクトへの参照がなくなったとガベージ コレクションによって判断されたときに、オブジェクトのガベージ コレクターによって呼び出されます。

(継承元 Object)
Notify()

このオブジェクトのモニターで待機している 1 つのスレッドを起動します。

(継承元 Object)
NotifyAll()

このオブジェクトのモニターで待機しているすべてのスレッドを起動します。

(継承元 Object)
Offer(Object, IBiPredicate)

Flow.Subscriber#onNext(Object) onNext メソッドを非同期的に呼び出すことによって、可能であれば、指定された項目を現在の各サブスクライバーに発行します。

Offer(Object, Int64, TimeUnit, IBiPredicate)

可能であれば、指定された項目を現在の各サブスクライバーに発行します。その場合は、 Flow.Subscriber#onNext(Object) onNext メソッドを非同期で呼び出し、指定したタイムアウトまで、または呼び出し元スレッドが中断されるまで、または指定されたハンドラー (null 以外の場合) が呼び出されるまで、サブスクリプションのリソースをブロックし、true を返す場合は 1 回再試行します。

SetHandle(IntPtr, JniHandleOwnership)

Handle プロパティを設定します。

(継承元 Object)
SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する Flow.Publisher 。

(継承元 JavaObject)
Submit(Object)

Flow.Subscriber#onNext(Object) onNext メソッドを非同期的に呼び出して、指定された項目を現在の各サブスクライバーに発行します。サブスクライバーのリソースが使用できない間は中断されずにブロックされます。

Subscribe(Flow+ISubscriber)

既にサブスクライブしていない限り、指定されたサブスクライバーを追加します。

ToArray<T>()

このJava配列ラッパーからマネージド配列を作成します。

(継承元 Object)
ToString()

オブジェクトの文字列表現を返します。

(継承元 Object)
UnregisterFromRuntime()

相互運用ランタイムからこのJava ピアの登録を解除します。

(継承元 Object)
Wait()

現在のスレッドが起動するまで待機します。通常は、 <em>notified</em> または <em>interrupted</em>。

(継承元 Object)
Wait(Int64, Int32)

現在のスレッドは、通常、 <em>notified</em> または <em>interrupted</em>、または一定のリアルタイムが経過するまで、起動されるまで待機します。

(継承元 Object)
Wait(Int64)

現在のスレッドは、通常、 <em>notified</em> または <em>interrupted</em>、または一定のリアルタイムが経過するまで、起動されるまで待機します。

(継承元 Object)

明示的なインターフェイスの実装

名前 説明
IJavaPeerable.Disposed()

現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する Flow.Publisher 。

(継承元 JavaObject)
IJavaPeerable.Finalized()

現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する Flow.Publisher 。

(継承元 JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する Flow.Publisher 。

(継承元 JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する Flow.Publisher 。

(継承元 JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する Flow.Publisher 。

(継承元 JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する Flow.Publisher 。

(継承元 JavaObject)
IJavaPeerable.UnregisterFromRuntime()

現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する Flow.Publisher 。

拡張メソッド

名前 説明
GetJniTypeName(IJavaPeerable)

インスタンス selfの型の JNI 名を取得します。

JavaAs<TResult>(IJavaPeerable)

selfを強制的にTResult入力し、強制型がJava側で有効であることを確認します。

JavaCast<TResult>(IJavaObject)

Android ランタイムチェック型変換を実行します。

JavaCast<TResult>(IJavaObject)

現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する Flow.Publisher 。

TryJavaCast<TResult>(IJavaPeerable, TResult)

selfを強制的にTResult入力し、強制型がJava側で有効であることを確認します。

適用対象