【问题标题】:Usecase of CountDownLatch where CyclicBarrier can't be used无法使用 CyclicBarrier 的 CountDownLatch 用例
【发布时间】:2018-08-13 05:29:43
【问题描述】:

对我来说 CountDownLatch 和 CyclicBarrier 之间的区别仅在于 CyclicBarrier 提供了比 CountDownLatch 更多的功能,例如当所有线程都到达障碍点时,您可以执行某个任务。您可以在循环屏障中找到没有等待线程和没有到达线程。所以这意味着我们可以在所有使用 CountDownLatch 的地方使用 CyclicBarrier。如果我错了,请纠正我。那么为什么在java中给出CountDownLatch。如果我们可以使用 CyclicBarrier 执行这些功能,为什么它不会被弃用。

【问题讨论】:

标签: java concurrency countdownlatch cyclicbarrier


【解决方案1】:

CyclicBarier 等待一定数量的线程,而CountDownLatch 等待一定数量的事件(一个线程可以多次调用CountDownLatch.countDown())。 CountDownLatch一旦打开就不能重复使用。此外,调用CountDownLatch.countDown() 的线程仅表示它完成了一些工作。它不会阻塞(并且在CyclicBarrier.await() 中是阻塞方法)并且可以继续做一些其他的事情。

来自 javadoc

A CountDownLatch 初始化为 N 可用于使一个线程等待,直到 N 个线程有 完成了某项操作,或某项操作已完成 N 次

【讨论】:

  • 你能分享一个真实的小用例吗?一个线程会多次调用 countDown()。
  • @Indiverkumar 并不是一个真正的“现实世界”示例,因为我不使用CountDownLatche/CyclicBarrier。您的主线程需要等到完成添加到某个集合中的 N 个任务。而且它不能产生 N 个线程(由于一些限制)。它可以创建CountDownLatch,每个任务将递减CountDownLatch。在该主线程产生之后,假设 N/2 个线程并将这些任务集合提供给它们并等待闩锁打开。
猜你喜欢
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 2020-03-25
  • 2014-06-22
  • 2021-07-09
  • 2014-05-19
  • 2014-04-12
相关资源
最近更新 更多