Flow Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых Publisher Publishers
создаются элементы, потребляемые одним или несколькими Subscriber
Subscribers
, каждый из которых управляется 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
- Наследование
- Атрибуты
Комментарии
Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых Publisher Publishers
создаются элементы, потребляемые одним или несколькими Subscriber Subscribers
, каждый из которых управляется Subscription Subscription
.
Эти интерфейсы соответствуют спецификации реактивных потоков . Они применяются как в параллельных, так и в распределенных асинхронных параметрах. Все (семь) методов определяются в void
"односторонном" стиле сообщений. Обмен данными основан на простой форме управления потоком (метод Subscription#request
), который можно использовать, чтобы избежать проблем управления ресурсами, которые в противном случае могут возникнуть в системах на основе "принудительной отправки".
<b>Примеры.</b> A Publisher
обычно определяет собственную 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
.
Части этой страницы являются изменениями, основанными на работе, созданной и совместно используемой проектом и используемой в соответствии с условиями, Creative Commons 2.5 Attribution License Creative Commons 2.5 Attribution License.
Свойства
Class |
Возвращает класс среды выполнения данного объекта |
Handle |
Дескриптор базового экземпляра Android. (Унаследовано от Object) |
JniIdentityHashCode |
Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых |
JniPeerMembers |
Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых |
PeerReference |
Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых |
ThresholdClass |
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода. (Унаследовано от Object) |
ThresholdType |
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода. (Унаследовано от 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> или <прерывания></em>. (Унаследовано от Object) |
Wait(Int64) |
Заставляет текущий поток ждать, пока он не будет пробужден, как правило, из-за <уведомления</>em>, <>прерывания< или> em, либо до истечения определенного количества реального времени. (Унаследовано от Object) |
Wait(Int64, Int32) |
Заставляет текущий поток ждать, пока он не будет пробужден, как правило, из-за <уведомления</>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) |
Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых |