我有以下程序,我在其中使用 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.");
}
输出
二是等待。
三是等待。
一个是等待。
一个是完成。
二是完成。
三是完成。
最佳答案
CountDownLatch
是同步原语,用于等待所有线程完成某些操作。
每个线程都应该通过调用 countDown()
方法来标记完成的工作。等待 Action 完成的人应该调用 await()
方法。这将无限期地等待,直到所有线程通过调用 countDown()
将工作标记为已处理。例如,主线程可以继续处理工作线程的结果。
因此,在您的示例中,在 await()
方法的末尾调用 main()
是有意义的:
latch.await();
注意:当然还有很多其他用例,它们不需要是线程,但是无论通常是异步运行的,同一个锁可以被同一个任务等递减几次。 以上仅描述了
CountDownLatch
的一个常见用例.关于multithreading - CountDownLatch 中 await() 的目的是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41866691/