logo

CountDownLatch u Javi

CountDownLatch se koristi kako bi se osiguralo da zadatak čeka druge niti prije pokretanja. Kako bismo razumjeli njegovu primjenu, razmotrimo poslužitelj na kojem se glavni zadatak može pokrenuti tek kada se pokrenu sve potrebne usluge. Rad CountDownLatch-a: Kada kreiramo objekt CountDownLatch-a, navodimo broj niti koje treba čekati dok sve takve niti moraju izvršiti odbrojavanje pozivom CountDownLatch.countDown() nakon što su dovršene ili spremne za posao. Čim broj dosegne nulu, zadatak na čekanju se pokreće. Primjer CountDownLatch-a u JAVI: 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();  }  } } 
Izlaz:
WORKER-1 finished WORKER-2 finished WORKER-3 finished WORKER-4 finished main has finished 
Činjenice o CountDownLatchu:
  1. Stvaranje objekta CountDownLatch prosljeđivanjem int njegovom konstruktoru (broj) zapravo je broj pozvanih strana (niti) za događaj.
  2. Nit čija obrada ovisi o drugim nitima čeka dok svaka druga nit ne pozove odbrojavanje. Sve niti koje čekaju na await() nastavljaju zajedno kada odbrojavanje dosegne nulu.
  3. countDown() metoda dekrementira count i await() metodu blokova dok count == 0