CyclicBarrier/CountDownLatch和加入Java有什么区别?

2022-09-03 04:12:49

在 Java 中 , / 和 有什么区别?和 的优点是什么?在我看来,只需使用我们可以等待线程完成其执行即可。CyclicBarrierCountDownLatchjoinCyclicBarrierCountDownLatchjoin


答案 1

是的,“t.join()”使当前线程等待“t”线程完成,当线程等待其他线程时,我们可以准备线程链。但有时CountDownLatch/CyclicBarrier更方便。

首先,CountDownLatch/CyclicBarrier不需要所有的工作线程都应该完成。线程可以在应用程序运行时一直运行。他们只是让我们说“一些工作”已经做了很多次。此外,如果我们有 N 个作业和 M 个线程,N 个> M,则某些线程可以多次完成一个作业,直到它们常见的 barier N 为 0。此示例显示 CountDownLatch/CyclicBarrier 是非常有用的基元,可以在 M 个线程之间共享 N 个任务。

此外,要使用 join(),每个线程都应该有一个对另一个线程的引用来调用 join()。它使您的代码有点脏,特别是当您有超过2个工作线程时。共享一个 CountDownLatch/CyclicBarrier 实例看起来更清晰。

CyclicBarrier和CountDownLatch之间的主要区别在于CyclicBarrier是可重用的,而CountDownLatch不是。您可以通过调用 reset() 方法重用 CyclicBarrier,该方法将屏障重置为其初始状态。

CountDownLatch适用于一次性事件,如应用程序/模块启动时间,CyclicBarrier可用于在发生循环事件的情况下,例如,每次输入数据更改时并发(重新)计算。

你可以在以下位置找到一些很好的例子:

http://javarevisited.blogspot.sg/2012/07/countdownlatch-example-in-java.html http://javarevisited.blogspot.ru/2012/07/cyclicbarrier-example-java-5-concurrency-tutorial.html


答案 2

join()等待一个线程完成。 允许 N 个线程等待倒计时达到 0。它可以用来确保N个线程同时开始做某事(例如,开始比赛),或者在N个线程达到给定点(例如,比赛结束)后唤醒另一个线程。CountDownLatch.await()

javadoc给出了一个使用CountDownLatch的具体例子。阅读它。

CyclicBarrier类似于CountDownLatch,但允许定期协调点。


推荐