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
其构造函数中提供的 传递给订阅者。 执行程序的最佳选择取决于预期的使用情况。 如果生成器 (提交项的) 在单独的线程中运行,并且可以估计订阅服务器数,请考虑使用 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) onError
Flow.Subscriber#onSubscribe onSubscribe
Flow.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.SubmissionPublisher
Java 文档。
此页面的某些部分是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的条款使用。
构造函数
SubmissionPublisher() |
使用 |
SubmissionPublisher(IExecutor, Int32) |
使用给定的执行程序创建一个新的 SubmissionPublisher 以异步传送到订阅服务器,每个订阅服务器具有给定的最大缓冲区大小,并且方法 |
SubmissionPublisher(IExecutor, Int32, IBiConsumer) |
使用给定的执行程序创建一个新的 SubmissionPublisher,以便同步传送到订阅服务器,每个订阅服务器具有给定的最大缓冲区大小,如果不是 null,则当任何订阅服务器在方法 |
SubmissionPublisher(IntPtr, JniHandleOwnership) |
一个 , |
属性
Class |
返回此 |
ClosedException |
返回与 |
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() |
唤醒正在等待此对象的监视器的单个线程。 (继承自 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>interrupted</em>。<> (继承自 Object) |
Wait(Int64) |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<> (继承自 Object) |
Wait(Int64, Int32) |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</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) |
一个 , |