logo

CountDownLatch w Javie

CountDownLatch służy do upewnienia się, że zadanie czeka na inne wątki przed uruchomieniem. Aby zrozumieć jego zastosowanie, rozważmy serwer, na którym główne zadanie może się rozpocząć dopiero wtedy, gdy uruchomią się wszystkie wymagane usługi. Działanie CountDownLatch: Kiedy tworzymy obiekt CountDownLatch, określamy liczbę wątków, które powinien on czekać, aż wszystkie wątki muszą wykonać odliczanie, wywołując CountDownLatch.countDown() po ich ukończeniu lub gotowości do zadania. Gdy tylko liczba osiągnie zero, rozpoczyna się wykonywanie oczekującego zadania. Przykład CountDownLatch w 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();  }  } } 
Wyjście:
WORKER-1 finished WORKER-2 finished WORKER-3 finished WORKER-4 finished main has finished 
Fakty na temat CountDownLatch:
  1. Tworzenie obiektu CountDownLatch poprzez przekazanie int do jego konstruktora (liczba) jest w rzeczywistości liczbą zaproszonych stron (wątków) na wydarzenie.
  2. Wątek, którego przetwarzanie zależy od innych wątków, czeka, aż każdy inny wątek wywoła odliczanie. Wszystkie wątki oczekujące na oczekiwanie() postępują razem, gdy odliczanie osiągnie zero.
  3. Metoda countDown() zmniejsza liczbę bloków metod Count i Wait() aż do uzyskania count == 0