【问题标题】:What is the difference between join and CountDownLatch?join 和 CountDownLatch 有什么区别?
【发布时间】:2012-09-03 22:33:50
【问题描述】:

当等待其他线程完成时,我们可以使用joinCountdownLatch。使用这两种机制的优缺点是什么?

【问题讨论】:

  • CountDownLatch 提供线程之间的协调。
  • @veer - 1) 这取决于你如何使用它。 2) 很明显 OP 并没有为此目的使用它 - “当等待其他线程完成时......”

标签: java multithreading countdownlatch


【解决方案1】:

如果您自己处理线程,则只能使用Thread.join。大多数人选择不直接处理线程处理的细节,而是使用ExecutorService 为他们处理。 ExecutorServices 不会直接透露他们是如何执行任务的,因此您将必须使用CountDownLatch:(假设您不想只使用shutdown 整个服务,即.)

ExecutorService service = Executors.newFixedThreadPool(5);
final CountDownLatch latch = new CountDownLatch(5);

for(int x = 0; x < 5; x++) {
    service.submit(new Runnable() {
        public void run() {
            // do something
            latch.countDown();
        }
    });
}

latch.await();

【讨论】:

    【解决方案2】:

    另一个区别是在join() 之后,线程只有在加入的线程完成执行后才能解除阻塞,而在CountDownLatch 中,线程可以根据任何条件在线程完成时或两者之间随时减少计数。
    这样我们可以更好地控制线程的解除阻塞,而不是仅仅依赖于加入线程的完成。

    【讨论】:

      【解决方案3】:

      join() 正在等待另一个线程完成,而 CountDownLatch 是为其他目的而设计的。如果使用 CountDownLatch,您不必像我们必须使用 join() 那样引用您正在等待的线程。假设您想在至少有 2 名玩家可用时开始游戏。在这种情况下,您可以使用 countdownlatch。但是你不能使用 join 轻松实现这一点,因为你没有另一个线程(在这种情况下是玩家)可以编写 join()。

      【讨论】:

        【解决方案4】:

        CountdownLatch 是面向任务的 - 它与线程无关。可以将一大堆不相关的任务集提交给线程池,并且 CountdownLatch 将确保每个集都通知发起者完成。 Join() 是一个令人讨厌的缩写,它将任务链接到线程,简单地说,一开始就不应该进入该语言。可悲的是,一大堆热气腾腾的线程教程在第一页上提到了 Join(),从而将线程作为死锁生成器介绍给新手并生成线程放克:(

        【讨论】:

          【解决方案5】:

          CountdownLatch允许您更改 Item 的实现以提交给 Executor 服务,而不是直接使用线程。

          CountDownLatch 类允许我们协调线程的启动和停止。典型用途如下:

          1. 我们可以让多个线程同时启动;
          2. 我们可以等待 几个线程要完成(而,例如,Thread.join() 方法只允许你等待一个线程)。

          你可以看看这个 -> http://javahowto.blogspot.com/2011/08/when-to-join-threads-with.html

          还有这个-> A CountDownLatch's latch.await() method vs Thread.join()

          【讨论】:

          • #2 可以通过遍历每个正在使用的Thread 并调用join 来完成。
          猜你喜欢
          • 1970-01-01
          • 2010-09-07
          • 1970-01-01
          • 2010-10-28
          相关资源
          最近更新 更多