Язык

Phaser Класс

Определение

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

[Android.Runtime.Register("java/util/concurrent/Phaser", DoNotGenerateAcw=true)]
public class Phaser : Java.Lang.Object
[<Android.Runtime.Register("java/util/concurrent/Phaser", DoNotGenerateAcw=true)>]
type Phaser = class
    inherit Object
Наследование
Атрибуты

Комментарии

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

<b>Регистрация.</b> В отличие от других барьеров, количество сторон<, зарегистрированных> или em<> для синхронизации на фазировщике, может меняться с течением времени. Задачи могут быть зарегистрированы в любое время (с помощью методов #register#bulkRegisterили форм конструкторов, устанавливающих начальные числа сторон), и при необходимости отменять регистрацию при поступлении (с помощью#arriveAndDeregister). Как и в случае с большинством основных конструкций синхронизации, регистрация и отмена регистрации влияют только на внутренние счетчики; они не устанавливают дополнительную внутреннюю бухгалтерию, поэтому задачи не могут запрашивать, регистрируются ли они. (Однако вы можете ввести такие книги, подклассив этот класс.)

<b>Синхронизация.</b> Нравится CyclicBarrier, может Phaser быть несколько ожиданий. Метод #arriveAndAwaitAdvance действует аналогично методу java.util.concurrent.CyclicBarrier#await CyclicBarrier.await. Каждое поколение фазера имеет связанный номер этапа. Номер этапа начинается с нуля, и прогресс, когда все стороны приходят на фазировщик, обтекая около нуля после достижения Integer.MAX_VALUE. Использование номеров этапов позволяет независимо контролировать действия при поступлении на фазировщик и при ожидании других, используя два типа методов, которые могут вызываться любой зарегистрированной стороной:

<Ул>

<li><b>Arrival.</b> Методы #arrive и #arriveAndDeregister запись прибытия. Эти методы не блокируются, но возвращают связанный <>номер< этапа прибытия или em>, то есть номер этапа фазера, к которому применено прибытие. При поступлении последней стороны для заданного этапа выполняется необязательное действие, а этап выполняется. Эти действия выполняются стороной, активируя этап заранее, и упорядочиываются путем переопределения метода #onAdvance(int, int), который также управляет завершением. Переопределение этого метода аналогично, но более гибко, чем предоставление барьерного действия.CyclicBarrier

<li><b>Ожидание.<Для метода > /b#awaitAdvance требуется аргумент, указывающий номер этапа прибытия, и возвращается, когда фазировщик переходит (или уже находится) на другом этапе. В отличие от аналогичных конструкций, метод CyclicBarrierawaitAdvance продолжает ждать, даже если поток ожидания прерывается. Доступны также версии прерывания и времени ожидания, но исключения, возникающие в то время как задачи ждут прерывания или с временем ожидания, не изменяют состояние фазера. При необходимости можно выполнить любое связанное восстановление в обработчиках этих исключений, часто после вызова forceTermination. Фазеры также могут использоваться задачами, выполняемыми в объекте ForkJoinPool. Ход выполнения гарантируется, если уровень параллелизма пула может соответствовать максимальному количеству одновременно заблокированных сторон.

</ul>

<b>Завершение.</b> фазировщик может ввести <>состояние завершения< или em>, которое может быть проверено с помощью метода#isTerminated. После завершения все методы синхронизации немедленно возвращаются без ожидания заранее, как указано отрицательным возвращаемым значением. Аналогичным образом попытки регистрации после прекращения не влияют. Завершение активируется при вызове onAdvance возврата true. Реализация по умолчанию возвращается true , если дерегистрация привела к нулю числа зарегистрированных сторон. Как показано ниже, когда фазерные действия управления с фиксированным числом итераций часто удобно переопределить этот метод, чтобы вызвать завершение, когда текущий номер этапа достигает порогового значения. Метод #forceTermination также доступен для резкого выпуска потоков ожидания и их завершения.

<b>Уровня.</b> Phasers могут быть <>многоуровневые</em> (т. е. созданные в деревах структур) для уменьшения состязаний. Этапы с большим количеством сторон, которые в противном случае могут столкнуться с большими затратами на синхронизацию, могут быть настроены таким образом, чтобы группы подфазеров совместно используют общий родительский элемент. Это может значительно увеличить пропускную способность, несмотря на то, что она приводит к увеличению затрат на операции.

В дереве многоуровневых фазеров регистрация и отмена регистрации дочерних фазеров с родительским элементом управляются автоматически. Каждый раз, когда число зарегистрированных сторон дочернего фазировщика становится ненулевым (как установлено в конструкторе #Phaser(Phaser,int) или#register#bulkRegister), дочерний фазировщик регистрируется в родительском элементе. Каждый раз, когда число зарегистрированных сторон становится нулевым в результате вызова #arriveAndDeregister, дочерний фазировщик отменяется от родительского элемента.

<b>Мониторинг.</b> В то время как методы синхронизации могут вызываться только зарегистрированными сторонами, текущее состояние фазера может отслеживаться любым вызывающим лицом. В любой момент есть #getRegisteredParties стороны в целом, из которых #getArrivedParties прибыли на текущий этап (#getPhase). Когда остальные (#getUnarrivedParties) стороны прибывают, этап переходит к этапу. Значения, возвращаемые этими методами, могут отражать временные состояния, поэтому не являются общими полезными для управления синхронизацией. Метод #toString возвращает моментальные снимки этих запросов состояния в форме, удобной для неформального мониторинга.

Эффекты согласованности памяти: действия до любой формы метода <прибыть i>happen-before</i> соответствующего этапа вперед и действия onAdvance (если присутствует), которые, в свою очередь, происходят перед действиями после этапа.

<b>Примеры использования:</b>

Можно Phaser использовать вместо CountDownLatch того, чтобы управлять однострельным действием, обслуживающим переменное число сторон. Типичный идиом предназначен для метода, устанавливаемого этим методом до первого регистрации, а затем запускают все действия, а затем отменяют регистрацию, как в следующем:

{@code
            void runTasks(List<Runnable> tasks) {
              Phaser startingGate = new Phaser(1); // "1" to register self
              // create and start threads
              for (Runnable task : tasks) {
                startingGate.register();
                new Thread(() -> {
                  startingGate.arriveAndAwaitAdvance();
                  task.run();
                }).start();
              }

              // deregister self to allow threads to proceed
              startingGate.arriveAndDeregister();
            }}

Одним из способов многократного выполнения действий для заданного количества итераций является переопределение onAdvanceнабора потоков:

{@code
            void startTasks(List<Runnable> tasks, int iterations) {
              Phaser phaser = new Phaser() {
                protected boolean onAdvance(int phase, int registeredParties) {
                  return phase >= iterations - 1 || registeredParties == 0;
                }
              };
              phaser.register();
              for (Runnable task : tasks) {
                phaser.register();
                new Thread(() -> {
                  do {
                    task.run();
                    phaser.arriveAndAwaitAdvance();
                  } while (!phaser.isTerminated());
                }).start();
              }
              // allow threads to proceed; don't wait for them
              phaser.arriveAndDeregister();
            }}

Если основная задача должна завершиться позже, она может повторно зарегистрировать и выполнить аналогичный цикл:

{@code
              // ...
              phaser.register();
              while (!phaser.isTerminated())
                phaser.arriveAndAwaitAdvance();}

Связанные конструкции могут использоваться для ожидания определенных номеров этапов в контекстах, где вы уверены, что этап никогда не будет обтекаться Integer.MAX_VALUE. Рассмотрим пример.

{@code
            void awaitPhase(Phaser phaser, int phase) {
              int p = phaser.register(); // assumes caller not already registered
              while (p < phase) {
                if (phaser.isTerminated())
                  // ... deal with unexpected termination
                else
                  p = phaser.arriveAndAwaitAdvance();
              }
              phaser.arriveAndDeregister();
            }}

Чтобы создать набор n задач с помощью дерева фазеров, можно использовать код следующей формы, при условии, что класс Task с конструктором принимает значение Phaser , которое он регистрирует при построении. После вызова build(new Task[n], 0, n, new Phaser())этих задач можно будет запустить, например, отправив в пул:

{@code
            void build(Task[] tasks, int lo, int hi, Phaser ph) {
              if (hi - lo > TASKS_PER_PHASER) {
                for (int i = lo; i < hi; i += TASKS_PER_PHASER) {
                  int j = Math.min(i + TASKS_PER_PHASER, hi);
                  build(tasks, i, j, new Phaser(ph));
                }
              } else {
                for (int i = lo; i < hi; ++i)
                  tasks[i] = new Task(ph);
                  // assumes new Task(ph) performs ph.register()
              }
            }}

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

<Примечание о реализации:></b> Эта реализация ограничивает максимальное число сторон 65535. Попытки регистрации дополнительных сторон приводят к IllegalStateExceptionрезультату. Однако вы можете и должны создавать многоуровневые фазировщики для размещения произвольных больших наборов участников.

Добавлено в версии 1.7.

Java документации по java.util.concurrent.Phaser.

Части этой страницы — это изменения на основе работы, созданной и общей Project и используемых в соответствии с условиями, описанными в разделе "".

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

Имя. Описание
Phaser()

Создает новый фазировщик без первоначально зарегистрированных сторон, родительского и начального номера этапа 0.

Phaser(Int32)

Создает новый фазировщик с заданным числом зарегистрированных неуправляемых сторон, без родительского и начального номера 0 этапа.

Phaser(IntPtr, JniHandleOwnership)

Конструктор, используемый при создании управляемых представлений объектов JNI; вызывается средой выполнения.

Phaser(Phaser, Int32)

Создает новый фазировщик с заданным родительским и числом зарегистрированных неуправляемых сторон.

Phaser(Phaser)

Эквивалентно #Phaser(Phaser, int) Phaser(parent, 0).

Свойства

Имя. Описание
ArrivedParties

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

Class

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

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

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

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

Возвращает, true если этот фазировщик был завершен.

JniIdentityHashCode

Возвращает хэш-код удостоверения, назначенный этому Java одноранговой среде выполнения взаимодействия.

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

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

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

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

Parent

Возвращает родительский элемент этого фазера или null , если нет.

PeerReference

Возвращает ссылку на объект JNI для этого Java однорангового узла.

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

Возвращает текущий номер этапа.

RegisteredParties

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

Root

Возвращает корневой предок этого фазера, который совпадает с этим фазировщиком, если он не имеет родительского элемента.

ThresholdClass

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

ThresholdType

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

UnarrivedParties

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

Методы

Имя. Описание
Arrive()

Прибывает на этот фазировщик, не ожидая прибытия других.

ArriveAndAwaitAdvance()

Прибывает на этот фазировщик и ожидает других.

ArriveAndDeregister()

Прибывает на этот поэтапный и отменяет регистрацию из него, не ожидая, пока другие прибывают.

AwaitAdvance(Int32)

Ожидает, что этап этого фазера переходит от заданного значения этапа, возвращая немедленно, если текущий этап не равен заданному значению этапа или этот фазор завершается.

AwaitAdvanceInterruptibly(Int32, Int64, TimeUnit)

Ожидает этап этого фазера, чтобы перейти от заданного значения этапа или заданного времени ожидания, вызывая при прерывании во время ожидания или возвращая InterruptedException немедленно, если текущий этап не равен заданному значению этапа или этот этап завершается.

AwaitAdvanceInterruptibly(Int32)

Ожидает этап этого фазера, чтобы перейти от заданного значения этапа, вызывая при прерывании во время ожидания или возвращая InterruptedException немедленно, если текущий этап не равен заданному значению этапа или этот фазор завершается.

BulkRegister(Int32)

Добавляет заданное число новых неуправляемых сторон в этот фазировщик.

Clone()

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

(Унаследовано от Object)
Construct(JniObjectReference, JniObjectReferenceOptions)

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

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

Освобождает ресурсы, удерживаемые этим Java одноранговым узлом.

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

Освобождает ресурсы, удерживаемые этим Java одноранговым узлом.

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

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

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

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

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

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

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

Заставляет этот фазировщик входить в состояние завершения.

GetHashCode()

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

(Унаследовано от Object)
JavaFinalize()
Устаревшие.

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

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

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

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

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

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

Переопределяемый метод для выполнения действия при переходе к этапу перехода и управления завершением.

Register()

Добавляет новую неуправляемую сторону в этот фазировщик.

SetHandle(IntPtr, JniHandleOwnership)

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

(Унаследовано от Object)
SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

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

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

Создает управляемый массив из этого Java оболочки массива.

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

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

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

Отменяет регистрацию этого Java однорангового узла из среды выполнения взаимодействия.

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

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

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

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

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

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

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

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

Имя. Описание
IJavaPeerable.Disposed()

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

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

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

(Унаследовано от JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

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

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

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

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

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

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

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

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

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

Имя. Описание
GetJniTypeName(IJavaPeerable)

Возвращает имя JNI типа экземпляра self.

JavaAs<TResult>(IJavaPeerable)

Попробуйте принуждать к типуself, проверяяTResult, является ли приведение допустимым на стороне Java.

JavaCast<TResult>(IJavaObject)

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

JavaCast<TResult>(IJavaObject)

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

TryJavaCast<TResult>(IJavaPeerable, TResult)

Попробуйте принуждать к типуself, проверяяTResult, является ли приведение допустимым на стороне Java.

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