0

У меня есть следующая программа, где я использую java.util.concurrent.CountDownLatch и не используя метод wait(), который работает нормально. Я новичок в параллелизме и хочу узнать цель ожидания(). В «CyclicBarrier» я могу понять, зачем ждать(), но почему в «CountDownLatch»?Какова цель wait() в 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."); 
} 

OUTPUT два ждет. три - ожидание. один ждем. один выполнен. два завершены. три завершены.

ответ

0

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

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

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

latch.await(); 

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

+0

Спасибо Zbynek за быстрый ответ. Значит ли это, что несколько обратных отсчетов из одного потока будут считаться одним? – NewToJava

+0

@hungry: Нет. Каждый отсчет отсчитывается, независимо от того, является ли он одним и тем же. На самом деле ничего не известно о потоке. –

Смежные вопросы