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
- Наследование
- Атрибуты
- Реализации
Комментарии
Объект , 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 с помощью |
SubmissionPublisher(IExecutor, Int32) |
Создает объект SubmissionPublisher с использованием заданного исполнителя для асинхронной доставки подписчикам с заданным максимальным размером буфера для каждого подписчика и без обработчика исключений подписчика в методе |
SubmissionPublisher(IExecutor, Int32, IBiConsumer) |
Создает объект 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) |
Обрабатывает все опубликованные элементы с помощью данной функции Consumer. |
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> или <прерывания></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) |
Объект , |