logo

CountDownLatch в Java

CountDownLatch се използва, за да се увери, че дадена задача чака други нишки, преди да започне. За да разберем неговото приложение, нека разгледаме сървър, където основната задача може да започне само когато всички необходими услуги са стартирани. Работа на CountDownLatch: Когато създаваме обект на CountDownLatch, ние указваме броя на нишките, които трябва да изчака, докато всички такива нишки трябва да направят обратно броене, като извикаме CountDownLatch.countDown(), след като са завършени или готови за работа. Веднага щом броят достигне нула, чакащата задача започва да се изпълнява. Пример за CountDownLatch в 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();  }  } } 
Изход:
WORKER-1 finished WORKER-2 finished WORKER-3 finished WORKER-4 finished main has finished 
Факти за CountDownLatch:
  1. Създаването на обект на CountDownLatch чрез предаване на int на неговия конструктор (броя) всъщност е броят на поканените страни (нишки) за събитие.
  2. Нишката, която зависи от други нишки, за да започне обработка, изчаква, докато всяка друга нишка извика обратно броене. Всички нишки, които чакат на await(), продължават заедно, след като обратното броене достигне нула.
  3. Методът countDown() намалява блоковете на метода count и await() до count == 0