package ar.com.javacuriosities.concurrency.count_down_latch; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; /* * CountDownLatch: Nos permitirá establecer el número de eventos que deseamos que ocurran, antes de continuar con la ejecución. * Para indicar que debe esperar invocaremos al método await() y para ir disminuyendo el número de eventos usaremos el método * countDown(). */ public class Main { public static void main(String[] args) { // Creamos un contador con tres eventos CountDownLatch countDownLatch = new CountDownLatch(3); // Creamos el thread y le pasamos su contado new Task(countDownLatch).start(); try { System.out.println("Waiting for processes..."); // Esperamos que el contador llegue a cero countDownLatch.await(); } catch (InterruptedException e) { // Log and Handle exception e.printStackTrace(); } System.out.println("Finish"); } /* * Task simula varios procesos */ private static final class Task extends Thread { private CountDownLatch countDownLatch; public Task(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } @Override public void run() { try { // Realizamos 3 procesos System.out.println("Executing process 1..."); TimeUnit.SECONDS.sleep(2); // Cada llamada al count down resta uno a la cuenta final countDownLatch.countDown(); System.out.println("Executing process 2..."); TimeUnit.SECONDS.sleep(2); countDownLatch.countDown(); System.out.println("Executing process 3..."); TimeUnit.SECONDS.sleep(2); countDownLatch.countDown(); } catch (InterruptedException e) { // Log and Handle exception e.printStackTrace(); } } } }