CountDownLatch este folosit pentru a vă asigura că o sarcină așteaptă alte fire înainte de a începe. Pentru a înțelege aplicația sa, să luăm în considerare un server în care sarcina principală poate începe numai când toate serviciile necesare au început. Funcționarea CountDownLatch: Când creăm un obiect de CountDownLatch, specificăm numărul de fire de execuție pe care ar trebui să aștepte pentru ca toate aceste fire sunt necesare pentru a face numărătoare inversă, apelând CountDownLatch.countDown() odată ce sunt finalizate sau gata de lucru. De îndată ce numărul ajunge la zero, sarcina de așteptare începe să ruleze. Exemplu de CountDownLatch în 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(); } } } Ieșire: WORKER-1 finished WORKER-2 finished WORKER-3 finished WORKER-4 finished main has finished
Fapte despre CountDownLatch: - Crearea unui obiect de CountDownLatch prin trecerea unui int constructorului său (numărătoarea) este de fapt numărul de petreceri (threads) invitate pentru un eveniment.
- Firul care depinde de alte fire pentru a începe procesarea așteaptă până când fiecare alt fir de execuție a apelat numărătoarea inversă. Toate firele care așteaptă pe await() continuă împreună odată ce numărătoarea inversă ajunge la zero.
- Metoda countDown() decrementează blocurile metodei count și await() până când count == 0