SubmissionPublisher クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
現在の 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
- 継承
- 属性
- 実装
注釈
現在の Flow.Publisher
サブスクライバーに送信された (null 以外の) 項目を閉じるまで非同期的に発行する 。 現在の各サブスクライバーは、ドロップまたは例外が発生しない限り、同じ順序で新しく送信されたアイテムを受け取ります。 SubmissionPublisher を使用すると、項目ジェネレーターは、ドロップ処理やフロー制御のブロックに依存する 準拠のリアクティブ ストリーム パブリッシャーとして機能できます。
SubmissionPublisher は、サブスクライバーへの配信にコンストラクターで指定された を使用 Executor
します。 Executor の最適な選択は、予想される使用によって異なります。 送信されたアイテムのジェネレーターが別々のスレッドで実行され、サブスクライバーの数を見積もることができる場合は、 の使用を Executors#newFixedThreadPool
検討してください。 それ以外の場合は、既定値 (通常は ) を ForkJoinPool#commonPool
使用することを検討してください。
バッファリングにより、プロデューサーとコンシューマーは異なるレートで一時的に動作できます。 各サブスクライバーは、独立したバッファーを使用します。 バッファーは最初の使用時に作成され、必要に応じて指定された最大値まで拡張されます。 (強制容量は、2 の最も近い累乗に切り上げたり、この実装でサポートされている最大値に制限されたりする可能性があります)。の Flow.Subscription#request(long) request
呼び出しによってバッファーが拡張されるわけではありませんが、未入力の要求が最大容量を超えると、飽和状態が発生する可能性があります。 の既定値 Flow#defaultBufferSize()
は、予想される料金、リソース、使用状況に基づいて容量を選択するための出発点として役立つ場合があります。
1 つの SubmissionPublisher を複数のソース間で共有できます。 アイテムを発行する前またはシグナルを発行 <する前のソース スレッド内のアクション。>各サブスクライバーによる対応するアクセスの後に発生<する前/i> アクション。 しかし、報告されたラグと需要の見積もりは、同期制御ではなく監視で使用するように設計されており、古いビューや不正確な進行状況のビューを反映している可能性があります。
パブリケーション メソッドでは、バッファーが飽和した場合の処理に関するさまざまなポリシーがサポートされています。 メソッドは #submit(Object) submit
、リソースが使用可能になるまでブロックします。 これは最も単純ですが、応答性は最も低い方法です。 メソッドは offer
、項目を (直ちにまたは境界付きタイムアウトで) 削除できますが、ハンドラーをインターポーズしてから再試行する機会を提供します。
サブスクライバー メソッドが例外をスローした場合、そのサブスクリプションは取り消されます。 ハンドラーがコンストラクター引数として指定されている場合は、メソッド 内の例外に対して取り消し前に呼び出されますが、メソッド Flow.Subscriber#onNext onNext
Flow.Subscriber#onSubscribe onSubscribe
Flow.Subscriber#onError(Throwable) onError
内の例外は、取り消しFlow.Subscriber#onComplete() onComplete
前に記録または処理されません。 タスクを実行しようとしたときに指定された Executor が (またはその他の RuntimeException または Error) をスロー RejectedExecutionException
した場合、またはドロップ されたアイテムを処理するときにドロップ ハンドラーが例外をスローした場合、例外は再スローされます。 このような場合、すべてのサブスクライバーが発行されたわけではありません。 通常、このような場合は を使用することをお #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 ドキュメント java.util.concurrent.SubmissionPublisher
。
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。
コンストラクター
SubmissionPublisher() |
サブスクライバーへの非同期配信用に を |
SubmissionPublisher(IExecutor, Int32) |
サブスクライバーへの非同期配信用に指定された Executor を使用して新しい SubmissionPublisher を作成し、各サブスクライバーに対して指定された最大バッファー サイズを指定し、メソッド |
SubmissionPublisher(IExecutor, Int32, IBiConsumer) |
サブスクライバーへの非同期配信用に指定された Executor を使用して新しい SubmissionPublisher を作成し、各サブスクライバーに対して指定された最大バッファー サイズを指定し、null 以外の場合は、サブスクライバーが メソッド |
SubmissionPublisher(IntPtr, JniHandleOwnership) |
現在の |
プロパティ
Class |
この |
ClosedException |
に関連付けられている |
Executor |
非同期配信に使用される Executor を返します。 |
Handle |
基になる Android インスタンスへのハンドル。 (継承元 Object) |
HasSubscribers |
このパブリッシャーにサブスクライバーがある場合は true を返します。 |
IsClosed |
この発行元が送信を受け入れていない場合は true を返します。 |
JniIdentityHashCode |
現在の |
JniPeerMembers |
現在の |
MaxBufferCapacity |
サブスクライバーごとの最大バッファー容量を返します。 |
NumberOfSubscribers |
現在のサブスクライバーの数を返します。 |
PeerReference |
現在の |
Subscribers |
サブスクライバーでメソッドを呼び出すのではなく、監視と追跡の目的で現在のサブスクライバーの一覧を |
ThresholdClass |
現在の |
ThresholdType |
現在の |
メソッド
Clone() |
このオブジェクトのコピーを作成して返します。 (継承元 Object) |
Close() |
既に閉じていなければ、問題 |
CloseExceptionally(Throwable) |
既に閉じていなければ、問題 |
Consume(IConsumer) |
指定された Consumer 関数を使用して、発行されたすべてのアイテムを処理します。 |
Dispose() |
現在の |
Dispose(Boolean) |
現在の |
Equals(Object) |
他のオブジェクトがこのオブジェクトと "等しい" かどうかを示します。 (継承元 Object) |
EstimateMaximumLag() |
現在のすべてのサブスクライバー間で生成されたが、まだ使用されていないアイテムの最大数の見積もりを返します。 |
EstimateMinimumDemand() |
現在のすべてのサブスクライバー間で要求された (を介して |
GetHashCode() |
オブジェクトのハッシュ コード値を返します。 (継承元 Object) |
IsSubscribed(Flow+ISubscriber) |
現在の |
JavaFinalize() |
ガベージ コレクションがオブジェクトへの参照がなくなったと判断したときに、オブジェクトのガベージ コレクターによって呼び出されます。 (継承元 Object) |
Notify() |
このオブジェクトのモニターで待機している 1 つのスレッドをウェイクアップします。 (継承元 Object) |
NotifyAll() |
このオブジェクトのモニターで待機しているすべてのスレッドをウェイクアップします。 (継承元 Object) |
Offer(Object, IBiPredicate) |
メソッドを非同期的に呼び出 |
Offer(Object, Int64, TimeUnit, IBiPredicate) |
可能であれば、指定された項目を |
SetHandle(IntPtr, JniHandleOwnership) |
Handle プロパティを設定します。 (継承元 Object) |
Submit(Object) |
メソッドを非同期的に呼び出して、指定されたアイテムを |
Subscribe(Flow+ISubscriber) |
現在の |
ToArray<T>() |
現在の |
ToString() |
オブジェクトの文字列形式を返します。 (継承元 Object) |
UnregisterFromRuntime() |
現在の |
Wait() |
現在のスレッドが起動するまで待機します。通常<>は、通知</em> または <em>割り込み</em によって待機します>。 (継承元 Object) |
Wait(Int64) |
現在のスレッドが起動するまで待機します。通常<>は、通知</em> または>< em 割り込み</em>、または一定のリアルタイムが経過するまで待機します。 (継承元 Object) |
Wait(Int64, Int32) |
現在のスレッドが起動するまで待機します。通常<>は、通知</em> または>< em 割り込み</em>、または一定のリアルタイムが経過するまで待機します。 (継承元 Object) |
明示的なインターフェイスの実装
IJavaPeerable.Disposed() |
現在の |
IJavaPeerable.DisposeUnlessReferenced() |
現在の |
IJavaPeerable.Finalized() |
現在の |
IJavaPeerable.JniManagedPeerState |
現在の |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
現在の |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
現在の |
IJavaPeerable.SetPeerReference(JniObjectReference) |
現在の |
拡張メソッド
JavaCast<TResult>(IJavaObject) |
Android ランタイムチェック型変換を実行します。 |
JavaCast<TResult>(IJavaObject) |
現在の |
GetJniTypeName(IJavaPeerable) |
現在の |