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

缓冲允许生成者和使用者以不同的速率暂时运行。 每个订阅服务器使用独立的缓冲区。 缓冲区在首次使用时创建,并根据需要扩展到给定的最大值。 (强制执行的容量可能会向上舍入到最接近的 2 和/或受此实现支持的最大值的限制。) 调用 Flow.Subscription#request(long) request 不直接导致缓冲区扩展,但如果未填充的请求超过最大容量,则存在饱和风险。 的默认值 Flow#defaultBufferSize() 可以为根据预期的费率、资源和使用情况选择容量提供一个有用的起点。

单个 SubmissionPublisher 可以在多个源之间共享。 在发布项或发出信号 <之前,源线程中的操作在>各订阅者进行相应访问之后发出 i happen-before</i> 操作。 但报告的延迟和需求估计旨在用于监视,而不是同步控制,并可能反映过时或不准确的进度视图。

发布方法支持有关缓冲区饱和时要执行的操作的不同策略。 方法 #submit(Object) submit 阻止,直到资源可用。 这是最简单的,但响应最少。 方法 offer 可能会立即删除项或具有有限超时) (项,但提供了插入处理程序然后重试的机会。

如果任何订阅服务器方法引发异常,则取消其订阅。 如果处理程序作为构造函数参数提供,则会在方法 Flow.Subscriber#onNext onNext中出现异常时在取消之前调用它,但在取消之前不会记录或处理和 方法 Flow.Subscriber#onError(Throwable) onErrorFlow.Subscriber#onSubscribe onSubscribeFlow.Subscriber#onComplete() onComplete中的异常。 如果提供的执行程序在尝试执行任务时引发 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.SubmissionPublisherJava 文档。

此页面的某些部分是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的条款使用。

构造函数

SubmissionPublisher()

使用 ForkJoinPool#commonPool() 创建一个新的 SubmissionPublisher,以便 (异步传送到订阅服务器,除非它不支持至少 2 的并行级别,在这种情况下,将创建一个新的线程来运行每个任务) ,最大缓冲区容量为 Flow#defaultBufferSize,并且方法 Flow.Subscriber#onNext(Object) onNext中没有用于订阅服务器异常的处理程序。

SubmissionPublisher(IExecutor, Int32)

使用给定的执行程序创建一个新的 SubmissionPublisher 以异步传送到订阅服务器,每个订阅服务器具有给定的最大缓冲区大小,并且方法 Flow.Subscriber#onNext(Object) onNext中没有订阅服务器异常的处理程序。

SubmissionPublisher(IExecutor, Int32, IBiConsumer)

使用给定的执行程序创建一个新的 SubmissionPublisher,以便同步传送到订阅服务器,每个订阅服务器具有给定的最大缓冲区大小,如果不是 null,则当任何订阅服务器在方法 Flow.Subscriber#onNext(Object) onNext中引发异常时调用给定处理程序。

SubmissionPublisher(IntPtr, JniHandleOwnership)

一个 , Flow.Publisher 它以异步方式向当前订阅者发出提交 (非 null) 项,直到它关闭为止。

属性

Class

返回此 Object的运行时类。

(继承自 Object)
ClosedException

返回与 #closeExceptionally(Throwable) closeExceptionally关联的异常,如果未关闭或正常关闭,则返回 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)

使用给定的 Consumer 函数处理所有已发布的项。

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) ,给定处理程序 (,如果返回 true,则重试一次。

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 <通知/em> 或 <em>interrupted</em>。<>

(继承自 Object)
Wait(Int64)

导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<>

(继承自 Object)
Wait(Int64, Int32)

导致当前线程等待,直到它被唤醒,通常是通过 em <通知/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) 项,直到它关闭为止。

适用于