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
Наследование
Flow
Атрибуты

Комментарии

Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых 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

Возвращает класс среды выполнения данного объекта Object.

(Унаследовано от Object)
Handle

Дескриптор базового экземпляра Android.

(Унаследовано от Object)
JniIdentityHashCode

Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых Publisher Publishers создаются элементы, потребляемые одним или несколькими Subscriber Subscribers, каждый из которых управляется Subscription Subscription.

(Унаследовано от Object)
JniPeerMembers

Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых Publisher Publishers создаются элементы, потребляемые одним или несколькими Subscriber Subscribers, каждый из которых управляется Subscription Subscription.

PeerReference

Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых Publisher Publishers создаются элементы, потребляемые одним или несколькими Subscriber Subscribers, каждый из которых управляется Subscription Subscription.

(Унаследовано от Object)
ThresholdClass

Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода.

(Унаследовано от Object)
ThresholdType

Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода.

(Унаследовано от Object)

Методы

Clone()

Создает и возвращает копию этого объекта.

(Унаследовано от Object)
DefaultBufferSize()

Возвращает значение по умолчанию для буферизации издателя или подписчика, которое может использоваться при отсутствии других ограничений.

Dispose()

Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых Publisher Publishers создаются элементы, потребляемые одним или несколькими Subscriber Subscribers, каждый из которых управляется Subscription Subscription.

(Унаследовано от Object)
Dispose(Boolean)

Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых Publisher Publishers создаются элементы, потребляемые одним или несколькими Subscriber Subscribers, каждый из которых управляется Subscription Subscription.

(Унаследовано от Object)
Equals(Object)

Указывает, равен ли какой-то другой объект этому объекту.

(Унаследовано от Object)
GetHashCode()

Возвращает значение хэш-кода для объекта.

(Унаследовано от Object)
JavaFinalize()

Вызывается сборщиком мусора для объекта , когда сборка мусора определяет, что больше нет ссылок на объект .

(Унаследовано от Object)
Notify()

Пробуждение одного потока, ожидающего на мониторе этого объекта.

(Унаследовано от Object)
NotifyAll()

Активирует все потоки, ожидающие на мониторе этого объекта.

(Унаследовано от Object)
SetHandle(IntPtr, JniHandleOwnership)

Задает свойство Handle.

(Унаследовано от Object)
ToArray<T>()

Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых Publisher Publishers создаются элементы, потребляемые одним или несколькими Subscriber Subscribers, каждый из которых управляется Subscription Subscription.

(Унаследовано от Object)
ToString()

Возвращает строковое представление объекта.

(Унаследовано от Object)
UnregisterFromRuntime()

Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых Publisher Publishers создаются элементы, потребляемые одним или несколькими Subscriber Subscribers, каждый из которых управляется Subscription Subscription.

(Унаследовано от Object)
Wait()

Заставляет текущий поток ждать, пока он не будет пробужден, как правило, из-за <уведомления/><em> или <прерывания></em>.

(Унаследовано от Object)
Wait(Int64)

Заставляет текущий поток ждать, пока он не будет пробужден, как правило, из-за <уведомления</>em>, <>прерывания< или> em, либо до истечения определенного количества реального времени.

(Унаследовано от Object)
Wait(Int64, Int32)

Заставляет текущий поток ждать, пока он не будет пробужден, как правило, из-за <уведомления</>em>, <>прерывания< или> em, либо до истечения определенного количества реального времени.

(Унаследовано от Object)

Явные реализации интерфейса

IJavaPeerable.Disposed()

Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых Publisher Publishers создаются элементы, потребляемые одним или несколькими Subscriber Subscribers, каждый из которых управляется Subscription Subscription.

(Унаследовано от Object)
IJavaPeerable.DisposeUnlessReferenced()

Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых Publisher Publishers создаются элементы, потребляемые одним или несколькими Subscriber Subscribers, каждый из которых управляется Subscription Subscription.

(Унаследовано от Object)
IJavaPeerable.Finalized()

Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых Publisher Publishers создаются элементы, потребляемые одним или несколькими Subscriber Subscribers, каждый из которых управляется Subscription Subscription.

(Унаследовано от Object)
IJavaPeerable.JniManagedPeerState

Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых Publisher Publishers создаются элементы, потребляемые одним или несколькими Subscriber Subscribers, каждый из которых управляется Subscription Subscription.

(Унаследовано от Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых Publisher Publishers создаются элементы, потребляемые одним или несколькими Subscriber Subscribers, каждый из которых управляется Subscription Subscription.

(Унаследовано от Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых Publisher Publishers создаются элементы, потребляемые одним или несколькими Subscriber Subscribers, каждый из которых управляется Subscription Subscription.

(Унаследовано от Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых Publisher Publishers создаются элементы, потребляемые одним или несколькими Subscriber Subscribers, каждый из которых управляется Subscription Subscription.

(Унаследовано от Object)

Методы расширения

JavaCast<TResult>(IJavaObject)

Выполняет преобразование типа, проверенное средой выполнения Android.

JavaCast<TResult>(IJavaObject)

Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых Publisher Publishers создаются элементы, потребляемые одним или несколькими Subscriber Subscribers, каждый из которых управляется Subscription Subscription.

GetJniTypeName(IJavaPeerable)

Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых Publisher Publishers создаются элементы, потребляемые одним или несколькими Subscriber Subscribers, каждый из которых управляется Subscription Subscription.

Применяется к