CyclicBarrier/CountDownLatch和join在Java中有什么区别?

16

CyclicBarrierCountDownLatchjoin在Java中有什么区别?CyclicBarrierCountDownLatch的优点是什么?在我看来,只需要使用join就可以等待一个线程完成其执行。


是的,你可以使用join来解决许多场景,但使用CountDownLatch或CyclicBarrier会更容易。 - Pshemo
2个回答

27
是的,“t.join()”使当前线程等待“t”线程完成,我们可以准备一系列线程,当一个线程正在等待另一个线程时。但有时候CountDownLatch/CyclicBarrier更方便。
首先,CountDownLatch/CyclicBarrier不要求所有工作线程都应该完成。这些线程可以在应用程序运行时一直运行。它们只是让我们说“某些工作”已经完成了若干次。此外,如果我们有N个任务和M个线程,N>M,则某些线程可以多次执行一个任务,直到它们的公共屏障N为0。这个例子显示了CountDownLatch/CyclicBarrier是非常有用的原语,可以在M个线程之间共享N个任务。
此外,要使用join(),每个线程都应该有一个对另一个线程的引用来调用join()。这使得你的代码有点臃肿,特别是当你有两个以上的工作线程时。共享一个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


11

join() 等待一个线程完成。 CountDownLatch.await() 允许 N 个线程等待,直到倒计时结束。它可用于确保 N 个线程同时开始执行某些操作(例如开始比赛),或在 N 个线程达到某个特定点后唤醒另一个线程(例如比赛结束)。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接