package ar.com.javacuriosities.concurrency.cycle_barrier; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; /* * CyclicBarrier puede ser usado cuando queramos ejecutar un proceso al * finalizar X procesos. Se tendrá que definir el número de procesos a tratar * antes de lanzar este proceso cíclico. */ public class Main { public static void main(String[] args) { /* * Se lanzará el proceso cíclico cada vez que CyclicBarrier alcanze la barrera, en este caso * eso pasaría al tener 2 parties(threads). * Para añadir parties(threads) hay que llamar a await(). */ CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new CyclicProcess()); new ThreadCyclicBarrier("Thread-1", cyclicBarrier).start(); new ThreadCyclicBarrier("Thread-2", cyclicBarrier).start(); new ThreadCyclicBarrier("Thread-3", cyclicBarrier).start(); new ThreadCyclicBarrier("Thread-4", cyclicBarrier).start(); } /* * Thread que simula un proceso que el sistema va a ejecutar de manera cíclica cuando el contador llegue a la cantidad indicada */ private static final class CyclicProcess extends Thread { @Override public void run() { System.out.println("Checking system data..."); /* Operaciones del sistema: * comprobar memoria libre, estado del procesador, * estado de las aplicaciones externas, etc. */ System.out.println("System OK"); } } /* * Thread que recibe el CycleBarrier y cuando se ejecuta incrementa * sus parties */ private static final class ThreadCyclicBarrier extends Thread { private CyclicBarrier cyclicBarrier; public ThreadCyclicBarrier(String name, CyclicBarrier cyclicBarrier) { super(name); this.cyclicBarrier = cyclicBarrier; } @Override public void run() { System.out.println("Checking:" + getName()); try { /* * Añadimos parties(threads) al CyclicBarrier así cuando se alcancen todos los parties(threads) que definimos en el constructor se lanzará el hilo cíclico. */ cyclicBarrier.await(); } catch (InterruptedException | BrokenBarrierException e) { // Log and Handle exception e.printStackTrace(); } } } }