CountDownLatch s'utilitza per assegurar-se que una tasca espera altres fils abans de començar. Per entendre la seva aplicació, considerem un servidor on la tasca principal només pot començar quan s'han iniciat tots els serveis necessaris. Funcionament de CountDownLatch: Quan creem un objecte de CountDownLatch, especifiquem el nombre de fils que ha d'esperar perquè tots aquests fils siguin necessaris per fer el compte enrere cridant a CountDownLatch.countDown() un cop s'hagin completat o preparat per a la feina. Tan bon punt el recompte arriba a zero, la tasca d'espera comença a executar-se. Exemple 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(); } } } Sortida: WORKER-1 finished WORKER-2 finished WORKER-3 finished WORKER-4 finished main has finished
Fets sobre CountDownLatch: - Crear un objecte de CountDownLatch passant un int al seu constructor (el recompte) és en realitat el nombre de parts convidades (fils) per a un esdeveniment.
- El fil que depèn d'altres fils per començar a processar espera fins que tots els altres fils hagin cridat el compte enrere. Tots els fils que estan esperant await() continuen junts una vegada que el compte enrere arriba a zero.
- El mètode countDown() disminueix els blocs del mètode count i await() fins que count == 0