Java中CyclicBarrier
/ CountDownLatch
和join
之间的区别是什么? CyclicBarrier
和CountDownLatch
有什么好处?在我看来,只需使用join
我们就可以等待一个线程完成它的执行。
答案 0 :(得分:25)
是的,“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
答案 1 :(得分:11)
join()
等待一个线程完成。 CountDownLatch.await()
允许N个线程等到倒计时到达0.它可用于确保N个线程同时开始执行某些操作(例如,开始竞争),或者在N个线程中唤醒另一个线程已达到一个给定点(例如比赛结束)。
The javadoc给出了使用CountDownLatch的具体示例。阅读它。
CyclicBarrier类似于CountDownLatch,但允许定期协调点。