CountDownLatch se utiliza para garantizar que una tarea espere otros subprocesos antes de comenzar. Para comprender su aplicación, consideremos un servidor donde la tarea principal sólo puede comenzar cuando se han iniciado todos los servicios requeridos. Funcionamiento de CountDownLatch: Cuando creamos un objeto de CountDownLatch, especificamos la cantidad de subprocesos que debe esperar para que todos esos subprocesos deban realizar una cuenta regresiva llamando a CountDownLatch.countDown() una vez que estén completos o listos para el trabajo. Tan pronto como el recuento llega a cero, la tarea de espera comienza a ejecutarse. Ejemplo de CountDownLatch en JAVA: Java // Java Program to demonstrate how // to use CountDownLatch Its used // when a thread needs to wait for other // threads before starting its work. import java.util.concurrent.CountDownLatch; public class CountDownLatchDemo { public static void main(String args[]) throws InterruptedException { // Let us create task that is going to // wait for four threads before it starts CountDownLatch latch = new CountDownLatch(4); // Let us create four worker // threads and start them. Worker first = new Worker(1000 latch 'WORKER-1'); Worker second = new Worker(2000 latch 'WORKER-2'); Worker third = new Worker(3000 latch 'WORKER-3'); Worker fourth = new Worker(4000 latch 'WORKER-4'); first.start(); second.start(); third.start(); fourth.start(); // The main task waits for four threads latch.await(); // Main thread has started System.out.println(Thread.currentThread().getName() + ' has finished'); } } // A class to represent threads for which // the main thread waits. class Worker extends Thread { private int delay; private CountDownLatch latch; public Worker(int delay CountDownLatch latch String name) { super(name); this.delay = delay; this.latch = latch; } @Override public void run() { try { Thread.sleep(delay); latch.countDown(); System.out.println(Thread.currentThread().getName() + ' finished'); } catch (InterruptedException e) { e.printStackTrace(); } } } Producción: WORKER-1 finished WORKER-2 finished WORKER-3 finished WORKER-4 finished main has finished
Datos sobre CountDownLatch: - Crear un objeto de CountDownLatch pasando un int a su constructor (el recuento) es en realidad el número de partes invitadas (hilos) para un evento.
- El subproceso que depende de otros subprocesos para comenzar a procesar espera hasta que todos los demás subprocesos hayan iniciado la cuenta regresiva. Todos los subprocesos que están esperando en await() continúan juntos una vez que la cuenta regresiva llega a cero.
- El método countDown() disminuye los bloques del método count y await() hasta que count == 0