SubmissionPublisher Класс

Определение

Объект , 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
Наследование
SubmissionPublisher
Атрибуты
Реализации

Комментарии

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт. Каждый текущий подписчик получает новые отправленные элементы в том же порядке, если не обнаружены исключения или удаления. Использование SubmissionPublisher позволяет генераторам элементов действовать в качестве соответствующих издателей реактивных потоков , использующих обработку удаления и (или) блокировку для управления потоком.

SubmissionPublisher использует предоставленный в конструкторе Executor объект для доставки подписчикам. Оптимальный выбор исполнителя зависит от ожидаемого использования. Если генераторы отправленных элементов работают в отдельных потоках и можно оценить количество подписчиков, рассмотрите Executors#newFixedThreadPoolвозможность использования . В противном случае рекомендуется использовать значение по умолчанию, обычно .ForkJoinPool#commonPool

Буферизация позволяет производителям и потребителям временно работать с разными скоростями. Каждый подписчик использует независимый буфер. Буферы создаются при первом использовании и расширяются по мере необходимости до заданного максимума. (Принудительную емкость можно округлить до ближайшей мощности из двух и(или) быть ограничена наибольшим значением, поддерживаемым этой реализацией.) Вызовы не приводят непосредственно к расширению буфера, но при превышении Flow.Subscription#request(long) request максимальной емкости незаполненные запросы рискуют. Значение Flow#defaultBufferSize() по умолчанию может быть полезной отправной точкой для выбора емкости на основе ожидаемых показателей, ресурсов и использования.

Один объект SubmissionPublisher может быть общим для нескольких источников. Действия в исходном потоке перед публикацией элемента или выдачой сигнала <о>выполнении i-before</i> действий после соответствующего доступа со стороны каждого подписчика. Однако сообщаемые оценки задержки и спроса предназначены для использования в мониторинге, а не для контроля синхронизации и могут отражать устаревшие или неточные представления о ходе выполнения.

Методы публикации поддерживают различные политики действий при переполнении буферов. Метод #submit(Object) submit блокируется до тех пор, пока не будут доступны ресурсы. Это самый простой, но наименее быстрый. Методы offer могут удалять элементы (немедленно или с ограниченным временем ожидания), но предоставляют возможность вставить обработчик, а затем повторить попытку.

Если какой-либо метод подписчика вызывает исключение, его подписка отменяется. Если обработчик предоставляется в качестве аргумента конструктора, он вызывается перед отменой при исключении в методе Flow.Subscriber#onNext onNext, но исключения в методах Flow.Subscriber#onSubscribe onSubscribeи Flow.Subscriber#onError(Throwable) onError не записываются и Flow.Subscriber#onComplete() onComplete не обрабатываются до отмены. Если предоставленный исполнитель создает RejectedExecutionException исключение (или любое другое исключение RuntimeException или Error) при попытке выполнить задачу или обработчик удаления создает исключение при обработке удаленного элемента, то исключение повторно создается. В таких случаях опубликованный элемент будет выдан не всем подписчикам. Обычно рекомендуется в #closeExceptionally closeExceptionally таких случаях.

Метод #consume(Consumer) упрощает поддержку распространенного случая, когда единственным действием подписчика является запрос и обработка всех элементов с помощью предоставленной функции.

Этот класс также может служить удобной базой для подклассов, создающих элементы, и использовать методы этого класса для их публикации. Например, здесь приведен класс, который периодически публикует элементы, созданные поставщиком. (На практике вы можете добавить методы для независимого запуска и остановки создания, для совместного использования исполнителей среди издателей и т. д. или использовать SubmissionPublisher в качестве компонента, а не суперкласса.)

{@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 для java.util.concurrent.SubmissionPublisher.

Части этой страницы являются изменениями, основанными на работе, созданной и совместно используемой проектом и используемой в соответствии с условиями, Creative Commons 2.5 Attribution License Creative Commons 2.5 Attribution License.

Конструкторы

SubmissionPublisher()

Создает объект SubmissionPublisher с помощью ForkJoinPool#commonPool() для асинхронной доставки подписчикам (если он не поддерживает уровень параллелизма не менее двух, в этом случае создается новый поток для выполнения каждой задачи), с максимальной емкостью буфера, равной Flow#defaultBufferSize, и без обработчика исключений подписчика в методе Flow.Subscriber#onNext(Object) onNext.

SubmissionPublisher(IExecutor, Int32)

Создает объект SubmissionPublisher с использованием заданного исполнителя для асинхронной доставки подписчикам с заданным максимальным размером буфера для каждого подписчика и без обработчика исключений подписчика в методе Flow.Subscriber#onNext(Object) onNext.

SubmissionPublisher(IExecutor, Int32, IBiConsumer)

Создает объект SubmissionPublisher с использованием заданного исполнителя для асинхронной доставки подписчикам с заданным максимальным размером буфера для каждого подписчика и, если значение не равно NULL, заданный обработчик вызывается, когда любой подписчик создает исключение в методе Flow.Subscriber#onNext(Object) onNext.

SubmissionPublisher(IntPtr, JniHandleOwnership)

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

Свойства

Class

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

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

Возвращает исключение, связанное с #closeExceptionally(Throwable) closeExceptionally, или значение NULL, если не закрыто или закрыто нормально.

Executor

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

Handle

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

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

Возвращает значение true, если у этого издателя есть подписчики.

IsClosed

Возвращает значение true, если издатель не принимает отправки.

JniIdentityHashCode

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

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

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

MaxBufferCapacity

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

NumberOfSubscribers

Возвращает количество текущих подписчиков.

PeerReference

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

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

Возвращает список текущих подписчиков для мониторинга и отслеживания, а не для вызова Flow.Subscriber методов на подписчиках.

ThresholdClass

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

ThresholdType

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

Методы

Clone()

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

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

Если она не закрыта, выдает Flow.Subscriber#onComplete() onComplete сигналы текущим подписчикам и запрещает последующие попытки публикации.

CloseExceptionally(Throwable)

Если она не закрыта, выдает Flow.Subscriber#onError(Throwable) onError сигнал текущим подписчикам с указанной ошибкой и запрещает последующие попытки публикации.

Consume(IConsumer)

Обрабатывает все опубликованные элементы с помощью данной функции Consumer.

Dispose()

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

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

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

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

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

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

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

EstimateMinimumDemand()

Возвращает оценку минимального количества элементов, запрошенных (через Flow.Subscription#request(long) request), но еще не созданных среди всех текущих подписчиков.

GetHashCode()

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

(Унаследовано от Object)
IsSubscribed(Flow+ISubscriber)

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

JavaFinalize()

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

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

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

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

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

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

Публикует данный элемент, если это возможно, для каждого текущего подписчика путем асинхронного вызова его Flow.Subscriber#onNext(Object) onNext метода.

Offer(Object, Int64, TimeUnit, IBiPredicate)

Публикует данный элемент, если это возможно, для каждого текущего подписчика путем асинхронного вызова его Flow.Subscriber#onNext(Object) onNext метода, блокируя, пока ресурсы для любой подписки недоступны, до указанного времени ожидания или до прерывания потока вызывающего объекта, в этот момент вызывается заданный обработчик (если он не имеет значения NULL), и если он возвращает значение true, повторно выполняется один раз.

SetHandle(IntPtr, JniHandleOwnership)

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

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

Публикует данный элемент для каждого текущего подписчика, асинхронно вызывая его Flow.Subscriber#onNext(Object) onNext метод, блокируя беспелезно, пока ресурсы для любого подписчика недоступны.

Subscribe(Flow+ISubscriber)

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

ToArray<T>()

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

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

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

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

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

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

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

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

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

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

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

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

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

IJavaPeerable.Disposed()

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

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

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

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

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

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

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

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

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

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

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

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

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

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

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

JavaCast<TResult>(IJavaObject)

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

JavaCast<TResult>(IJavaObject)

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

GetJniTypeName(IJavaPeerable)

Объект , Flow.Publisher который асинхронно выдает отправленные (не null) элементы текущим подписчикам, пока не будет закрыт.

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