El propósito principal de Phaser es permitir la sincronización de subprocesos que representan una o más fases de actividad. Nos permite definir un objeto de sincronización que espera hasta que se haya completado una fase específica. Luego avanza a la siguiente fase hasta que esa fase concluye. También se puede usar para sincronizar una sola fase y, en ese sentido, actúa como una barrera cíclica.
Jerarquía de clases
java.lang.Object ? java.util.concurrent ? Class Phaser
Sintaxis
public class Phaser extends Object
Constructores:
- Phaser() : esto crea un phaser con inicialmente cero partes registradas. Un subproceso solo puede usar este phaser después de registrarse.
public Phaser()
- Phaser (partes internas) : esto crea un phaser que requiere un número de subprocesos de partes para avanzar a la siguiente fase.
public Phaser(int parties) throws IllegalArgumentException
- Phaser(Phaser parent) : especifica un phaser principal para el nuevo objeto. El número de partidos registrados se establece en cero.
public Phaser(Phaser parent)
- Phaser(Phaser parent, int parties) – Esto especifica un phaser principal para el objeto recién creado y el número de partes requeridas para avanzar a la siguiente fase.
public Phaser(Phaser parent, int parties) throws IllegalArgumentException
Ejemplo 1:
Nota : la salida puede variar con cada ejecución.
Java
// Java program to show Phaser Class import java.util.concurrent.Phaser; // A thread of execution that uses a phaser. class MyThread implements Runnable { Phaser phaser; String title; public MyThread(Phaser phaser, String title) { this.phaser = phaser; this.title = title; phaser.register(); new Thread(this).start(); } @Override public void run() { System.out.println("Thread: " + title + " Phase Zero Started"); phaser.arriveAndAwaitAdvance(); // Stop execution to prevent jumbled output try { Thread.sleep(10); } catch (InterruptedException e) { System.out.println(e); } System.out.println("Thread: " + title + " Phase One Started"); phaser.arriveAndAwaitAdvance(); // Stop execution to prevent jumbled output try { Thread.sleep(10); } catch (InterruptedException e) { System.out.println(e); } System.out.println("Thread: " + title + " Phase Two Started"); phaser.arriveAndDeregister(); } } public class PhaserExample { public static void main(String[] args) { Phaser phaser = new Phaser(); phaser.register(); int currentPhase; System.out.println("Starting"); new MyThread(phaser, "A"); new MyThread(phaser, "B"); new MyThread(phaser, "C"); // Wait for all threads to complete phase Zero. currentPhase = phaser.getPhase(); phaser.arriveAndAwaitAdvance(); System.out.println("Phase " + currentPhase + " Complete"); System.out.println("Phase Zero Ended"); // Wait for all threads to complete phase One. currentPhase = phaser.getPhase(); phaser.arriveAndAwaitAdvance(); System.out.println("Phase " + currentPhase + " Complete"); System.out.println("Phase One Ended"); currentPhase = phaser.getPhase(); phaser.arriveAndAwaitAdvance(); System.out.println("Phase " + currentPhase + " Complete"); System.out.println("Phase Two Ended"); // Deregister the main thread. phaser.arriveAndDeregister(); if (phaser.isTerminated()) { System.out.println("Phaser is terminated"); } } }
Starting Thread: B Phase Zero Started Thread: A Phase Zero Started Thread: C Phase Zero Started Thread: A Phase One Started Thread: B Phase One Started Thread: C Phase One Started Phase 0 Complete Phase Zero Ended Phase 1 Complete Phase One Ended Thread: C Phase Two Started Thread: A Phase Two Started Thread: B Phase Two Started Phase 2 Complete Phase Two Ended Phaser is terminated
Ejemplo2:
Java
// Java program to show Phaser Class import java.util.concurrent.Phaser; // A thread of execution that uses a phaser. class MyThread implements Runnable { Phaser phaser; String title; public MyThread(Phaser phaser, String title) { this.phaser = phaser; this.title = title; phaser.register(); new Thread(this).start(); } @Override public void run() { System.out.println("Thread: " + title + " Phase Zero Started"); phaser.arriveAndAwaitAdvance(); // Stop execution to prevent jumbled output try { Thread.sleep(10); } catch (InterruptedException e) { System.out.println(e); } System.out.println("Thread: " + title + " Phase One Started"); phaser.arriveAndAwaitAdvance(); // Stop execution to prevent jumbled output try { Thread.sleep(10); } catch (InterruptedException e) { System.out.println(e); } System.out.println("Thread: " + title + " Phase Two Started"); phaser.arriveAndDeregister(); } } public class PhaserExample { public static void main(String[] args) { Phaser phaser = new Phaser(); phaser.register(); int currentPhase; System.out.println("Starting"); new MyThread(phaser, "A"); new MyThread(phaser, "B"); new MyThread(phaser, "C"); // Wait for all threads to complete phase Zero. currentPhase = phaser.getPhase(); phaser.arriveAndAwaitAdvance(); System.out.println("Phase " + currentPhase + " Complete"); System.out.println("Phase Zero Ended"); // Wait for all threads to complete phase One. currentPhase = phaser.getPhase(); phaser.arriveAndAwaitAdvance(); System.out.println("Phase " + currentPhase + " Complete"); System.out.println("Phase One Ended"); currentPhase = phaser.getPhase(); phaser.arriveAndAwaitAdvance(); System.out.println("Phase " + currentPhase + " Complete"); System.out.println("Phase Two Ended"); // Deregister the main thread. phaser.arriveAndDeregister(); if (phaser.isTerminated()) { System.out.println("Phaser is terminated"); } } }
Starting Thread: C Phase Zero Started Thread: A Phase Zero Started Thread: B Phase Zero Started Thread: B Phase One Started Thread: C Phase One Started Thread: A Phase One Started Phase 0 Complete Phase Zero Ended Phase 1 Complete Phase One Ended Thread: A Phase Two Started Thread: C Phase Two Started Thread: B Phase Two Started Phase 2 Complete Phase Two Ended Phaser is terminated
Métodos:
- int register() : este método se usa para registrar partes después de que se haya construido un phaser. Devuelve el número de fase de la fase a la que está registrado.
public int register() throws IllegalArgumentException
- llegada int() : este método indica que un subproceso ha completado una parte de la tarea. No suspende la ejecución del hilo de llamada. Devuelve el número de fase actual o un valor negativo si el phaser ha sido terminado.
public int arrive() throws IllegalStateException
- int arrivalAndDeregister() : este método permite que un subproceso llegue a una fase y se cancele, sin esperar a que lleguen otros subprocesos. Devuelve el número de fase actual o un valor negativo si el phaser ha sido terminado.
public int arriveAndDeregister() throws IllegalStateException
- int arrivalAndAwaitAdvance() : este método suspende la ejecución del subproceso en una fase, para esperar otros subprocesos. Devuelve el número de fase actual o un valor negativo si el phaser ha sido terminado.
public int arriveAndAwaitAdvance() throws IllegalStateException
- final int getPhase() : este método devuelve el número de fase actual. Se devuelve un valor negativo si los phasers invocadores terminaron.
public final int getPhase()
- booleano onAdvance(int fase, int partes) – Este método ayuda a definir cómo debe ocurrir un avance de fase. Para hacer esto, el usuario debe anular este método. Para finalizar el phaser, el método onAdvance() devuelve verdadero; de lo contrario, devuelve falso;
protected boolean onAdvance(int phase, int parties)
Ejemplo para demostrar los métodos de la clase Phaser , donde el método se anula para que Phaser ejecute solo un número específico de fases.
Java
// Java program to demonstrate // the methods of Phaser class import java.util.concurrent.Phaser; // Extend MyPhaser and override onAdvance() // so that only specific number of phases // are executed class MyPhaser extends Phaser { int numPhases; MyPhaser(int parties, int phaseCount) { super(parties); numPhases = phaseCount - 1; } @Override protected boolean onAdvance(int phase, int registeredParties) { System.out.println("Phase " + phase + " completed.\n"); // If all phases have completed, return true. if (phase == numPhases || registeredParties == 0) { return true; } // otherwise, return false return false; } } // A thread of execution that uses a phaser class ModifiedThread implements Runnable { Phaser phsr; String name; ModifiedThread(Phaser p, String n) { phsr = p; name = n; phsr.register(); new Thread(this).start(); } @Override public void run() { while (!phsr.isTerminated()) { System.out.println("Thread " + name + " Beginning Phase " + phsr.getPhase()); phsr.arriveAndAwaitAdvance(); try { Thread.sleep(10); } catch (InterruptedException e) { System.out.println(e); } } } } public class PhaserExample2 { public static void main(String[] args) { MyPhaser phsr = new MyPhaser(1, 4); System.out.println("Starting"); new ModifiedThread(phsr, "A"); new ModifiedThread(phsr, "B"); new ModifiedThread(phsr, "C"); while (!phsr.isTerminated()) { phsr.arriveAndAwaitAdvance(); } System.out.println("The phaser is terminated\n"); } }
Starting Thread B Beginning Phase 0 Thread C Beginning Phase 0 Thread A Beginning Phase 0 Phase 0 completed. Thread A Beginning Phase 1 Thread B Beginning Phase 1 Thread C Beginning Phase 1 Phase 1 completed. Thread C Beginning Phase 2 Thread A Beginning Phase 2 Thread B Beginning Phase 2 Phase 2 completed. Thread A Beginning Phase 3 Thread B Beginning Phase 3 Thread C Beginning Phase 3 Phase 3 completed. The phaser is terminated
Referencia: https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Phaser.html
Publicación traducida automáticamente
Artículo escrito por CharchitKapoor y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA