我有以下程序,我使用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.");
}
OUTPUT 两个是等待。 三是等待。 一个是等待。 一个是完成的。 二是完成。 三是完成。
答案 0 :(得分:0)
CountDownLatch
是同步原语,用于等待所有线程完成某些操作。
每个线程都应该通过调用countDown()
方法标记完成的工作。等待操作完成的人应该调用await()
方法。这将无限期地等待,直到所有线程通过调用countDown()
将工作标记为已处理。然后,主线程可以继续处理工作者的结果,例如。
因此,在您的示例中,在await()
方法结束时调用main()
是有意义的:
latch.await();
注意:当然还有许多其他用例,它们不需要是线程,但是通常异步运行的任何东西,相同的锁存器可以通过相同的任务等多次递减。上面描述了一个常见的用途CountDownLatch
的案例。