【问题标题】:what's the difference between CyclicBarrier/CountDownLatch and join in Java?Java 中的 CyclicBarrier/CountDownLatch 和 join 有什么区别?
【发布时间】:2014-02-16 08:12:53
【问题描述】:

CyclicBarrier/CountDownLatchjoin 在 Java 中的区别是什么? CyclicBarrierCountDownLatch 的优势是什么?在我看来,只要使用join,我们就可以等待一个线程完成它的执行。

【问题讨论】:

  • 是的,您可以简单地通过 join 解决许多场景,但使用 CountDownLatch 或 CyclicBarrier 会更容易。

标签: java concurrency java.util.concurrent


【解决方案1】:

是的,“t.join()”使当前线程等待“t”线程结束,当一个线程正在等待另一个线程时,我们可以准备一个线程链。但有时 CountDownLatch/CyclicBarrier 更方便。

首先,CountDownLatch/CyclicBarrier 并不要求所有工作线程都应该完成。线程可以在应用程序运行时一直运行。他们只是让我们说“一些工作”被做了很多次。此外,如果我们有 N 个作业和 M 个线程并且 N > M,一些线程可以多次执行一项作业,直到它们的公共屏障 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() 等待一个线程完成。 CountDownLatch.await() 允许 N 个线程等待倒计时到达 0。它可用于确保 N 个线程同时开始做某事(例如开始比赛),或在 N 个线程到达时唤醒另一个线程一个给定的点(例如比赛的结束)。

    The javadoc 给出了使用 CountDownLatch 的具体示例。阅读它。

    CyclicBarrier 类似于 CountDownLatch,但允许常规协调点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 2010-09-07
      • 1970-01-01
      • 2010-10-28
      相关资源
      最近更新 更多