SubmissionPublisher クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
現在のサブスクライバーに送信された (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
- 継承
- 属性
- 実装
注釈
現在のサブスクライバーに送信された (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 に追加されました。
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。
コンストラクター
| 名前 | 説明 |
|---|---|
| SubmissionPublisher() |
サブスクライバーへの非同期配信の |
| SubmissionPublisher(IExecutor, Int32, IBiConsumer) |
サブスクライバーへの非同期配信用に指定された Executor を使用して新しい SubmissionPublisher を作成し、各サブスクライバーの最大バッファー サイズを指定し、null 以外の場合は、サブスクライバーがメソッド |
| SubmissionPublisher(IExecutor, Int32) |
サブスクライバーへの非同期配信用に指定された Executor を使用して新しい SubmissionPublisher を作成し、各サブスクライバーに対して指定された最大バッファー サイズを指定し、メソッド |
| SubmissionPublisher(IntPtr, JniHandleOwnership) |
現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する |
プロパティ
| 名前 | 説明 |
|---|---|
| Class |
この |
| ClosedException |
|
| Executor |
非同期配信に使用される Executor を返します。 |
| Handle |
基になる Android インスタンスへのハンドル。 (継承元 Object) |
| HasSubscribers |
このパブリッシャーにサブスクライバーがある場合は true を返します。 |
| IsClosed |
この発行元が申請を受け入れられない場合は true を返します。 |
| JniIdentityHashCode |
相互運用ランタイムによってこのJava ピアに割り当てられた ID ハッシュ コードを取得します。 (継承元 Object) |
| JniManagedPeerState |
現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する |
| JniPeerMembers |
現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する |
| MaxBufferCapacity |
サブスクライバーごとの最大バッファー容量を返します。 |
| NumberOfSubscribers |
現在のサブスクライバーの数を返します。 |
| PeerReference |
このJava ピアの JNI オブジェクト参照を取得します。 (継承元 Object) |
| Subscribers |
サブスクライバーで |
| ThresholdClass |
現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する |
| ThresholdType |
現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する |
メソッド
| 名前 | 説明 |
|---|---|
| Clone() |
このオブジェクトのコピーを作成して返します。 (継承元 Object) |
| Close() |
既に閉じていなければ、問題 |
| CloseExceptionally(Throwable) |
既に閉じていなければ、問題 |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する |
| Consume(IConsumer) |
指定されたコンシューマー関数を使用して、発行されたすべてのアイテムを処理します。 |
| Dispose() |
このJava ピアによって保持されているリソースを解放します。 (継承元 Object) |
| Dispose(Boolean) |
このJava ピアによって保持されているリソースを解放します。 (継承元 Object) |
| DisposeUnlessReferenced() |
現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する |
| Equals(Object) |
現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する |
| Equals(Object) |
他のオブジェクトがこのオブジェクトと "等しい" かどうかを示します。 (継承元 Object) |
| EstimateMaximumLag() |
現在のすべてのサブスクライバー間で生成されたが、まだ消費されていない項目の最大数の推定値を返します。 |
| EstimateMinimumDemand() |
すべての現在のサブスクライバー間で要求された ( |
| GetHashCode() |
オブジェクトのハッシュ コード値を返します。 (継承元 Object) |
| IsSubscribed(Flow+ISubscriber) |
指定されたサブスクライバーが現在サブスクライブしている場合は true を返します。 |
| JavaFinalize() |
古い.
オブジェクトへの参照がなくなったとガベージ コレクションによって判断されたときに、オブジェクトのガベージ コレクターによって呼び出されます。 (継承元 Object) |
| Notify() |
このオブジェクトのモニターで待機している 1 つのスレッドを起動します。 (継承元 Object) |
| NotifyAll() |
このオブジェクトのモニターで待機しているすべてのスレッドを起動します。 (継承元 Object) |
| Offer(Object, IBiPredicate) |
|
| Offer(Object, Int64, TimeUnit, IBiPredicate) |
可能であれば、指定された項目を現在の各サブスクライバーに発行します。その場合は、 |
| SetHandle(IntPtr, JniHandleOwnership) |
Handle プロパティを設定します。 (継承元 Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する |
| Submit(Object) |
|
| 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 以外の) 項目を閉じるまで非同期的に発行する |
| IJavaPeerable.Finalized() |
現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する |
| IJavaPeerable.JniObjectReferenceControlBlock |
現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する |
| IJavaPeerable.UnregisterFromRuntime() |
現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する |
拡張メソッド
| 名前 | 説明 |
|---|---|
| GetJniTypeName(IJavaPeerable) |
インスタンス |
| JavaAs<TResult>(IJavaPeerable) |
|
| JavaCast<TResult>(IJavaObject) |
Android ランタイムチェック型変換を実行します。 |
| JavaCast<TResult>(IJavaObject) |
現在のサブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
|