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