Comparteix via


Phaser Clase

Definición

Una barrera de sincronización reutilizable, similar en funcionalidad a CyclicBarrier y CountDownLatch que admite un uso más flexible.

[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
Herencia
Phaser
Atributos

Comentarios

Una barrera de sincronización reutilizable, similar en funcionalidad a CyclicBarrier y CountDownLatch que admite un uso más flexible.

<b>Registro.</b> A diferencia del caso de otras barreras, el número de partes <em>registradas</em> para sincronizar en un phaser puede variar con el tiempo. Las tareas se pueden registrar en cualquier momento (mediante métodos #register, #bulkRegistero formas de constructores que establecen números iniciales de partes) y, opcionalmente, se anulan el registro a cualquier llegada (mediante #arriveAndDeregister). Como sucede con las construcciones de sincronización más básicas, el registro y la desregistración afectan solo a los recuentos internos; no establecen ninguna contabilidad interna adicional, por lo que las tareas no pueden consultar si están registradas. (Sin embargo, puede introducir este tipo de contabilidad mediante la subclase de esta clase).

<b>Sincronización.</b> Como , CyclicBarrierse puede esperar repetidamente .Phaser El método #arriveAndAwaitAdvance tiene un efecto análogo a java.util.concurrent.CyclicBarrier#await CyclicBarrier.await. Cada generación de un phaser tiene un número de fase asociado. El número de fase comienza en cero y avanza cuando todas las partes llegan al phaser, encapsulando alrededor de cero después de alcanzar Integer.MAX_VALUE. El uso de números de fase permite un control independiente de las acciones al llegar a un phaser y esperar a otros, a través de dos tipos de métodos que cualquier parte registrada pueda invocar:

<ul>

<li><b>Llegada.</b> Métodos #arrive y #arriveAndDeregister registro de llegada. Estos métodos no bloquean, pero devuelven un número< de fase de llegada/em> asociado<>; es decir, el número de fase del phaser al que se aplicó la llegada. Cuando llega la parte final de una fase determinada, se realiza una acción opcional y la fase avanza. Estas acciones las realiza la entidad que desencadena un avance de fase y se organizan invalidando el método #onAdvance(int, int), que también controla la terminación. La invalidación de este método es similar a, pero más flexible que, lo que proporciona una acción de barrera a .CyclicBarrier

<li><b>Esperando.<El método #awaitAdvance /b> requiere un argumento que indica un número de fase de llegada y devuelve cuando el phaser avanza a (o ya está en) una fase diferente. A diferencia de las construcciones similares que usan CyclicBarrier, el método awaitAdvance continúa esperando incluso si se interrumpe el subproceso en espera. Las versiones interrumpibles y de tiempo de espera también están disponibles, pero las excepciones detectadas mientras las tareas esperan interrumpiblemente o con el tiempo de espera no cambian el estado del phaser. Si es necesario, puede realizar cualquier recuperación asociada dentro de los controladores de esas excepciones, a menudo después de invocar forceTermination. Las fases también se pueden usar mediante tareas que se ejecutan en .ForkJoinPool Se garantiza el progreso si el nivel de paralelismo del grupo puede acomodar el número máximo de partes bloqueadas simultáneamente.

</ul>

<b>Terminación.</b> Un phaser puede especificar un <estado em>termination</em> , que se puede comprobar mediante el método #isTerminated. Tras la finalización, todos los métodos de sincronización devuelven inmediatamente sin esperar por adelantado, como se indica mediante un valor devuelto negativo. Del mismo modo, los intentos de registrarse tras la finalización no tienen ningún efecto. La terminación se desencadena cuando una invocación de onAdvance devuelve true. La implementación predeterminada devuelve true si una desregistración ha provocado que el número de partes registradas se convierta en cero. Como se muestra a continuación, cuando los phasers controlan acciones con un número fijo de iteraciones, a menudo es conveniente invalidar este método para provocar la terminación cuando el número de fase actual alcanza un umbral. El método #forceTermination también está disponible para liberar de forma abrupta los subprocesos en espera y permitirles finalizar.

<b>Niveles.</b> Las fases pueden ser <em>tiered</em> (es decir, construidos en estructuras de árbol) para reducir la contención. Los phasers con un gran número de partes que, de lo contrario, experimentarían costos de contención de sincronización intensivas pueden configurarse para que los grupos de subfásicos compartan un elemento primario común. Esto puede aumentar considerablemente el rendimiento aunque se produzca una mayor sobrecarga por operación.

En un árbol de fases en capas, el registro y la desregistración de fases secundarias con sus elementos primarios se administran automáticamente. Siempre que el número de partes registradas de un phaser secundario se convierte en distinto de cero (como se establece en el #Phaser(Phaser,int) constructor, #registero #bulkRegister), el phaser secundario se registra con su elemento primario. Cada vez que el número de entidades registradas se convierte en cero como resultado de una invocación de #arriveAndDeregister, el phaser secundario se anula del registro de su elemento primario.

<b>Supervisión.</b> Aunque los métodos de sincronización solo pueden invocarse por partes registradas, cualquier autor de llamada puede supervisar el estado actual de un phaser. En cualquier momento dado hay #getRegisteredParties partes en total, de las cuales #getArrivedParties han llegado a la fase actual (#getPhase). Cuando llegan las partes restantes (#getUnarrivedParties), la fase avanza. Los valores devueltos por estos métodos pueden reflejar estados transitorios, por lo que no son útiles en general para el control de sincronización. El método #toString devuelve instantáneas de estas consultas de estado en un formulario cómodo para la supervisión informal.

Efectos de coherencia de memoria: acciones anteriores a cualquier forma de método <de llegada i>happen-before</i> un avance de fase correspondiente y acciones onAdvance (si están presentes), lo que a su vez sucede antes de las acciones después del avance de fase.

<b>Usos de ejemplo:</b>

Phaser Se puede usar en CountDownLatch lugar de para controlar una acción de un solo disparo que sirve a un número variable de partes. La expresión típica es para el método que configura esto para el primer registro, después inicia todas las acciones y, a continuación, anula el registro, como en:

{@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();
            }}

Una manera de hacer que un conjunto de subprocesos realice repetidamente acciones para un número determinado de iteraciones es invalidar 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();
            }}

Si la tarea principal debe esperar después la finalización, puede volver a registrarla y, a continuación, ejecutar un bucle similar:

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

Las construcciones relacionadas se pueden usar para esperar números de fase concretos en contextos donde esté seguro de que la fase nunca se ajustará alrededor Integer.MAX_VALUEde . Por ejemplo:

{@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();
            }}

Para crear un conjunto de n tareas mediante un árbol de fases, puede usar código del siguiente formulario, suponiendo que una clase Task con un constructor acepte que Phaser se registre con tras la construcción. Después de build(new Task[n], 0, n, new Phaser())invocar , estas tareas se podrían iniciar, por ejemplo, mediante el envío a un grupo:

{@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()
              }
            }}

El mejor valor de depende principalmente de TASKS_PER_PHASER las tasas de sincronización esperadas. Un valor tan bajo como cuatro puede ser adecuado para cuerpos de tareas extremadamente pequeños por fase (por lo tanto altas tasas) o hasta cientos para los extremadamente grandes.

<b>Notas de implementación:</b> Esta implementación restringe el número máximo de partes a 65535. Los intentos de registrar entidades adicionales dan lugar a IllegalStateException. Sin embargo, puede y debe crear fases en capas para dar cabida a conjuntos arbitrarios de participantes de gran tamaño.

Agregado en la versión 1.7.

Documentación de Java para java.util.concurrent.Phaser.

Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el proyecto de código abierto de Android y se usan según los términos descritos en la licencia de atribución de Creative Commons 2.5.

Constructores

Phaser()

Crea un nuevo phaser sin entidades registradas inicialmente, sin elemento primario ni número de fase inicial 0.

Phaser(Int32)

Crea un nuevo phaser con el número especificado de entidades no administradas registradas, sin elemento primario ni número de fase inicial 0.

Phaser(IntPtr, JniHandleOwnership)

Constructor utilizado al crear representaciones administradas de objetos JNI; llamado por el tiempo de ejecución.

Phaser(Phaser)

Equivalente a #Phaser(Phaser, int) Phaser(parent, 0).

Phaser(Phaser, Int32)

Crea un nuevo phaser con el elemento primario especificado y el número de partes no administradas registradas.

Propiedades

ArrivedParties

Devuelve el número de partes registradas que han llegado a la fase actual de este phaser.

Class

Devuelve la clase en tiempo de ejecución de este Objectobjeto .

(Heredado de Object)
Handle

Identificador de la instancia de Android subyacente.

(Heredado de Object)
IsTerminated

Devuelve true si se ha terminado este phaser.

JniIdentityHashCode

Una barrera de sincronización reutilizable, similar en funcionalidad a CyclicBarrier y CountDownLatch que admite un uso más flexible.

(Heredado de Object)
JniPeerMembers

Una barrera de sincronización reutilizable, similar en funcionalidad a CyclicBarrier y CountDownLatch que admite un uso más flexible.

Parent

Devuelve el elemento primario de este phaser, o null si ninguno.

PeerReference

Una barrera de sincronización reutilizable, similar en funcionalidad a CyclicBarrier y CountDownLatch que admite un uso más flexible.

(Heredado de Object)
Phase

Devuelve el número de fase actual.

RegisteredParties

Devuelve el número de partes registradas en este phaser.

Root

Devuelve el antecesor raíz de este phaser, que es el mismo que este phaser si no tiene ningún elemento primario.

ThresholdClass

Esta API admite la infraestructura mono para Android y no está pensada para usarse directamente desde el código.

ThresholdType

Esta API admite la infraestructura mono para Android y no está pensada para usarse directamente desde el código.

UnarrivedParties

Devuelve el número de partes registradas que aún no han llegado a la fase actual de este phaser.

Métodos

Arrive()

Llega a este phaser, sin esperar a que lleguen otros.

ArriveAndAwaitAdvance()

Llega a este phaser y espera a otros.

ArriveAndDeregister()

Llega a este phaser y anula el registro desde él sin esperar a que lleguen otros.

AwaitAdvance(Int32)

Espera la fase de este phaser para avanzar desde el valor de fase especificado, devolviendo inmediatamente si la fase actual no es igual al valor de fase especificado o se termina este phaser.

AwaitAdvanceInterruptibly(Int32)

Espera la fase de este phaser para avanzar desde el valor de fase especificado, iniciando InterruptedException si se interrumpe mientras espera, o devolviendo inmediatamente si la fase actual no es igual al valor de fase especificado o se termina este phaser.

AwaitAdvanceInterruptibly(Int32, Int64, TimeUnit)

Espera la fase de este phaser para avanzar desde el valor de fase especificado o el tiempo de espera dado para transcurrir, iniciar InterruptedException si se interrumpe mientras se espera o devolver inmediatamente si la fase actual no es igual al valor de fase especificado o este phaser finaliza.

BulkRegister(Int32)

Agrega el número dado de nuevas partes norridas a este phaser.

Clone()

Crea y devuelve una copia de este objeto.

(Heredado de Object)
Dispose()

Una barrera de sincronización reutilizable, similar en funcionalidad a CyclicBarrier y CountDownLatch que admite un uso más flexible.

(Heredado de Object)
Dispose(Boolean)

Una barrera de sincronización reutilizable, similar en funcionalidad a CyclicBarrier y CountDownLatch que admite un uso más flexible.

(Heredado de Object)
Equals(Object)

Indica si algún otro objeto es "igual a" este.

(Heredado de Object)
ForceTermination()

Obliga a este phaser a entrar en estado de terminación.

GetHashCode()

Devuelve un valor de código hash del objeto.

(Heredado de Object)
JavaFinalize()

Lo llama el recolector de elementos no utilizados en un objeto cuando la recolección de elementos no utilizados determina que no hay más referencias al objeto .

(Heredado de Object)
Notify()

Activa un único subproceso que está esperando en el monitor de este objeto.

(Heredado de Object)
NotifyAll()

Activa todos los subprocesos que están esperando en el monitor de este objeto.

(Heredado de Object)
OnAdvance(Int32, Int32)

Método reemplazable para realizar una acción tras un avance de fase inminente y para controlar la terminación.

Register()

Agrega una nueva entidad norrived a este phaser.

SetHandle(IntPtr, JniHandleOwnership)

Establece la propiedad Handle.

(Heredado de Object)
ToArray<T>()

Una barrera de sincronización reutilizable, similar en funcionalidad a CyclicBarrier y CountDownLatch que admite un uso más flexible.

(Heredado de Object)
ToString()

Devuelve una representación de cadena del objeto.

(Heredado de Object)
UnregisterFromRuntime()

Una barrera de sincronización reutilizable, similar en funcionalidad a CyclicBarrier y CountDownLatch que admite un uso más flexible.

(Heredado de Object)
Wait()

Hace que el subproceso actual espere hasta que se despierta, normalmente por ser em notificado/em> o <em>interrumpido</em>.<><

(Heredado de Object)
Wait(Int64)

Hace que el subproceso actual espere hasta que se despierte, normalmente por ser <em>notificado</em> o <em>interrumpido</em>, o hasta que haya transcurrido una cierta cantidad de tiempo real.

(Heredado de Object)
Wait(Int64, Int32)

Hace que el subproceso actual espere hasta que se despierte, normalmente por ser <em>notificado</em> o <em>interrumpido</em>, o hasta que haya transcurrido una cierta cantidad de tiempo real.

(Heredado de Object)

Implementaciones de interfaz explícitas

IJavaPeerable.Disposed()

Una barrera de sincronización reutilizable, similar en funcionalidad a CyclicBarrier y CountDownLatch que admite un uso más flexible.

(Heredado de Object)
IJavaPeerable.DisposeUnlessReferenced()

Una barrera de sincronización reutilizable, similar en funcionalidad a CyclicBarrier y CountDownLatch que admite un uso más flexible.

(Heredado de Object)
IJavaPeerable.Finalized()

Una barrera de sincronización reutilizable, similar en funcionalidad a CyclicBarrier y CountDownLatch que admite un uso más flexible.

(Heredado de Object)
IJavaPeerable.JniManagedPeerState

Una barrera de sincronización reutilizable, similar en funcionalidad a CyclicBarrier y CountDownLatch que admite un uso más flexible.

(Heredado de Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Una barrera de sincronización reutilizable, similar en funcionalidad a CyclicBarrier y CountDownLatch que admite un uso más flexible.

(Heredado de Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Una barrera de sincronización reutilizable, similar en funcionalidad a CyclicBarrier y CountDownLatch que admite un uso más flexible.

(Heredado de Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

Una barrera de sincronización reutilizable, similar en funcionalidad a CyclicBarrier y CountDownLatch que admite un uso más flexible.

(Heredado de Object)

Métodos de extensión

JavaCast<TResult>(IJavaObject)

Realiza una conversión de tipos comprobados en tiempo de ejecución de Android.

JavaCast<TResult>(IJavaObject)

Una barrera de sincronización reutilizable, similar en funcionalidad a CyclicBarrier y CountDownLatch que admite un uso más flexible.

GetJniTypeName(IJavaPeerable)

Una barrera de sincronización reutilizable, similar en funcionalidad a CyclicBarrier y CountDownLatch que admite un uso más flexible.

Se aplica a