Какова цель await() в CountDownLatch?

У меня есть следующая программа, где я использую java.util.concurrent.CountDownLatch и без использования метода await() работает нормально. Я новичок в параллельности и хочу знать цель await(). В "CyclicBarrier" я могу понять, почему нужен await(), но почему в "CountDownLatch"?

Программа,

Класс CountDownLatchSimple

public static void main(String args[]) {
  CountDownLatch latch = new CountDownLatch(3);
  Thread one = new Thread(new Runner(latch),"one");
  Thread two = new Thread(new Runner(latch), "two");
  Thread three = new Thread(new Runner(latch), "three");

  // Starting all the threads
  one.start(); two.start(); three.start();

}

класс Runner реализует Runnable

CountDownLatch latch;

public Runner(CountDownLatch latch) {
    this.latch = latch;
}

@Override
public void run() {
    System.out.println(Thread.currentThread().getName()+" is Waiting.");
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    latch.countDown();
    System.out.println(Thread.currentThread().getName()+" is Completed.");
}

ВЫХОД два ждет. три ждет. один ждет. один завершен. два завершено. три завершено.

1 ответ

Решение

CountDownLatch это примитив синхронизации, который используется для ожидания всех потоков, выполняющих какое-либо действие.

Предполагается, что каждый поток помечает проделанную работу, вызывая countDown() метод. Тот, кто ждет завершения действия, должен позвонить await() метод. Это будет ждать бесконечно, пока все потоки не отметят работу как обработанную, вызвав countDown(), Затем можно продолжить основной поток, обработав, например, результаты работника.

Так что в вашем примере имеет смысл назвать await() в конце main() метод:

latch.await();

Примечание: конечно, есть много других вариантов использования, они не должны быть потоками, но независимо от того, что обычно выполняется асинхронно, одна и та же защелка может быть уменьшена в несколько раз одной и той же задачей и т. Д. Выше описан только один общий случай использования для CountDownLatch,

Другие вопросы по тегам