Flow 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
에 의해 관리되는 하나 이상의 Subscriber
Subscribers
에서 사용되는 항목을 생성하는 흐름 제어 구성 요소를 Publisher Publishers
설정하기 위한 상호 관련된 인터페이스 및 정적 메서드입니다Subscription
Subscription
.
[Android.Runtime.Register("java/util/concurrent/Flow", ApiSince=30, DoNotGenerateAcw=true)]
public sealed class Flow : Java.Lang.Object
[<Android.Runtime.Register("java/util/concurrent/Flow", ApiSince=30, DoNotGenerateAcw=true)>]
type Flow = class
inherit Object
- 상속
- 특성
설명
에 의해 관리되는 하나 이상의 Subscriber Subscribers
에서 사용되는 항목을 생성하는 흐름 제어 구성 요소를 Publisher Publishers
설정하기 위한 상호 관련된 인터페이스 및 정적 메서드입니다Subscription Subscription
.
이러한 인터페이스는 반응형 스트림 사양에 해당합니다 . 동시 및 분산 비동기 설정 모두에 적용됩니다. 모든(7개) 메서드는 "단방향" 메시지 스타일로 정의 void
됩니다. 통신은 "푸시" 기반 시스템에서 발생할 수 있는 리소스 관리 문제를 방지하는 데 사용할 수 있는 간단한 형태의 흐름 제어(메서드 Subscription#request
)를 사용합니다.
<b>예.</b>Publisher
A는 일반적으로 자체 Subscription
구현을 정의합니다. 메서드 subscribe
에서 구현하고 호출 Subscriber
에 발급합니다. 일반적으로 를 사용하여 Executor
구독자에게 항목을 비동기적으로 게시합니다. 예를 들어 다음은 단일 구독자에게 단일 TRUE
항목을 발급(요청된 경우)하는 매우 간단한 게시자입니다. 구독자는 단일 항목만 수신하므로 이 클래스는 대부분의 구현에 필요한 버퍼링 및 순서 지정 컨트롤을 사용하지 않습니다.
{@code
class OneShotPublisher implements Publisher<Boolean> {
private final ExecutorService executor = ForkJoinPool.commonPool(); // daemon-based
private boolean subscribed; // true after first subscribe
public synchronized void subscribe(Subscriber<? super Boolean> subscriber) {
if (subscribed)
subscriber.onError(new IllegalStateException()); // only one allowed
else {
subscribed = true;
subscriber.onSubscribe(new OneShotSubscription(subscriber, executor));
}
}
static class OneShotSubscription implements Subscription {
private final Subscriber<? super Boolean> subscriber;
private final ExecutorService executor;
private Future<?> future; // to allow cancellation
private boolean completed;
OneShotSubscription(Subscriber<? super Boolean> subscriber,
ExecutorService executor) {
this.subscriber = subscriber;
this.executor = executor;
}
public synchronized void request(long n) {
if (!completed) {
completed = true;
if (n <= 0) {
IllegalArgumentException ex = new IllegalArgumentException();
executor.execute(() -> subscriber.onError(ex));
} else {
future = executor.submit(() -> {
subscriber.onNext(Boolean.TRUE);
subscriber.onComplete();
});
}
}
}
public synchronized void cancel() {
completed = true;
if (future != null) future.cancel(false);
}
}
}}
는 Subscriber
항목을 요청하고 처리할 수 있도록 정렬합니다. 요청되지 않은 경우 항목( Subscriber#onNext
호출)은 발급되지 않지만 여러 항목을 요청할 수 있습니다. 많은 구독자 구현은 다음 예제의 스타일로 정렬할 수 있습니다. 여기서 버퍼 크기는 1단계이고 크기가 크면 일반적으로 통신이 적은 겹치는 처리를 보다 효율적으로 수행할 수 있습니다. 예를 들어 값이 64인 경우 총 미해결 요청은 32에서 64 사이로 유지됩니다. 지정된 Subscription
에 대한 구독자 메서드 호출은 엄격하게 정렬되므로 구독자가 여러 구독을 유지 관리하지 않는 한 이러한 메서드가 잠금 또는 휘발성을 사용할 필요가 없습니다(이 경우 각각 자체 구독을 사용하여 여러 구독자를 정의하는 것이 좋습니다).
{@code
class SampleSubscriber<T> implements Subscriber<T> {
final Consumer<? super T> consumer;
Subscription subscription;
final long bufferSize;
long count;
SampleSubscriber(long bufferSize, Consumer<? super T> consumer) {
this.bufferSize = bufferSize;
this.consumer = consumer;
}
public void onSubscribe(Subscription subscription) {
long initialRequestSize = bufferSize;
count = bufferSize - bufferSize / 2; // re-request when half consumed
(this.subscription = subscription).request(initialRequestSize);
}
public void onNext(T item) {
if (--count <= 0)
subscription.request(count = bufferSize - bufferSize / 2);
consumer.accept(item);
}
public void onError(Throwable ex) { ex.printStackTrace(); }
public void onComplete() {}
}}
의 기본값 #defaultBufferSize
은 예상 속도, 리소스 및 사용량에 따라 Flow 구성 요소에서 요청 크기 및 용량을 선택하는 데 유용한 시작점을 제공할 수 있습니다. 또는 흐름 제어가 필요하지 않은 경우 구독자는 처음에 다음과 같이 효과적으로 바인딩되지 않은 수의 항목을 요청할 수 있습니다.
{@code
class UnboundedSubscriber<T> implements Subscriber<T> {
public void onSubscribe(Subscription subscription) {
subscription.request(Long.MAX_VALUE); // effectively unbounded
}
public void onNext(T item) { use(item); }
public void onError(Throwable ex) { ex.printStackTrace(); }
public void onComplete() {}
void use(T item) { ... }
}}
9에 추가되었습니다.
에 대한 Java 설명서입니다 java.util.concurrent.Flow
.
이 페이지의 일부는 만들고 공유하며 에 설명된 조건에 따라 사용되는 작업을 기반으로 수정됩니다.
속성
Class |
이 |
Handle |
기본 Android instance 대한 핸들입니다. (다음에서 상속됨 Object) |
JniIdentityHashCode |
에 의해 관리되는 하나 이상의 |
JniPeerMembers |
에 의해 관리되는 하나 이상의 |
PeerReference |
에 의해 관리되는 하나 이상의 |
ThresholdClass |
이 API는 Android용 Mono 인프라를 지원하며 코드에서 직접 사용할 수 없습니다. (다음에서 상속됨 Object) |
ThresholdType |
이 API는 Android용 Mono 인프라를 지원하며 코드에서 직접 사용할 수 없습니다. (다음에서 상속됨 Object) |
메서드
Clone() |
이 개체의 복사본을 만들고 반환합니다. (다음에서 상속됨 Object) |
DefaultBufferSize() |
다른 제약 조건이 없는 경우 사용할 수 있는 게시자 또는 구독자 버퍼링의 기본값을 반환합니다. |
Dispose() |
에 의해 관리되는 하나 이상의 |
Dispose(Boolean) |
에 의해 관리되는 하나 이상의 |
Equals(Object) |
다른 개체가 이 개체와 "같음"인지 여부를 나타냅니다. (다음에서 상속됨 Object) |
GetHashCode() |
개체의 해시 코드 값을 반환합니다. (다음에서 상속됨 Object) |
JavaFinalize() |
가비지 수집에서 개체에 대한 참조가 더 이상 없다고 판단할 때 개체의 가비지 수집기에서 호출됩니다. (다음에서 상속됨 Object) |
Notify() |
이 개체의 모니터에서 대기 중인 단일 스레드를 해제합니다. (다음에서 상속됨 Object) |
NotifyAll() |
이 개체의 모니터에서 대기 중인 모든 스레드를 해제합니다. (다음에서 상속됨 Object) |
SetHandle(IntPtr, JniHandleOwnership) |
Handle 속성을 설정합니다. (다음에서 상속됨 Object) |
ToArray<T>() |
에 의해 관리되는 하나 이상의 |
ToString() |
개체의 문자열 표현을 반환합니다. (다음에서 상속됨 Object) |
UnregisterFromRuntime() |
에 의해 관리되는 하나 이상의 |
Wait() |
현재 스레드가 깨어날 때까지 대기하게 합니다( 일반적으로 <알림을 받><거나 <>중단/>em>)합니다<. (다음에서 상속됨 Object) |
Wait(Int64) |
현재 스레드가 깨어날 때까지 대기하게 합니다. 일반적으로 <>알림을 받<거나 <중단</>내보내>>거나 일정량의 실시간이 경과할 때까지 대기합니다. (다음에서 상속됨 Object) |
Wait(Int64, Int32) |
현재 스레드가 깨어날 때까지 대기하게 합니다. 일반적으로 <>알림을 받<거나 <중단</>내보내>>거나 일정량의 실시간이 경과할 때까지 대기합니다. (다음에서 상속됨 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) |
에 의해 관리되는 하나 이상의 |