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
。
緩衝可讓生產者和取用者暫時性地以不同的速率運作。 每個訂閱者都會使用獨立的緩衝區。 緩衝區會在第一次使用時建立,並視需要擴充到指定的最大值。 (強制執行的容量可能會四捨五入至兩個和/或受此實作所支援最大值的最接近乘冪。) 的調用 Flow.Subscription#request(long) request
不會直接造成緩衝區擴充,但如果未填滿的要求超過最大容量,則風險飽和度。 的預設值 Flow#defaultBufferSize()
可能會提供實用的起點,以根據預期的速率、資源和使用量來選擇容量。
單一提交發行者可以在多個來源之間共用。 在發佈專案之前,在來源執行緒中執行動作,或發出每個訂閱者後續對應存取的訊號 < i-before >< /i > 動作。 但回報的延遲和需求估計是設計用於監視,而不是用於同步處理控制,而且可能會反映進度的過時或不正確檢視。
發行集方法支援當緩衝區飽和時要執行哪些動作的不同原則。 方法 #submit(Object) submit
會封鎖,直到資源可用為止。 這是最簡單的,但回應最少。 方法 offer
可能會卸載專案 (立即或具有限定逾時) ,但提供插入處理常式的機會,然後再重試。
如果有任何訂閱者方法擲回例外狀況,則會取消其訂閱。 如果處理常式是以建構函式引數的形式提供,則會在方法 Flow.Subscriber#onNext onNext
中的例外狀況取消之前叫用,但在取消之前不會記錄或處理方法 Flow.Subscriber#onComplete() onComplete
Flow.Subscriber#onSubscribe onSubscribe
Flow.Subscriber#onError(Throwable) onError
中的例外狀況。 如果提供的執行程式在嘗試執行工作時擲 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) |
使用指定的 Executor 將非同步傳遞至訂閱者,為每個訂閱者建立新的 SubmissionPublisher,並針對每個訂閱者指定緩衝區大小上限,而且方法 |
SubmissionPublisher(IExecutor, Int32, IBiConsumer) |
使用指定的 Executor 將非同步傳遞至訂閱者,為每個訂閱者建立新的 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) |
使用指定的取用者函式處理所有已發佈的專案。 |
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 > notified < /em > 或 < em > interrupted < /em > 來喚醒。 (繼承來源 Object) |
Wait(Int64) |
讓目前的執行緒等到喚醒為止,通常是 < 透過 em > notified < /em 或 em > interrupted < /em >> ,或 < 直到經過一定數量的即時為止。 (繼承來源 Object) |
Wait(Int64, Int32) |
讓目前的執行緒等到喚醒為止,通常是 < 透過 em > notified < /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) |
,非同步 |