37

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

4

5 回答 5

32

Thread.join只有在您自己处理线程时才能使用。大多数人选择不直接处理线程处理的细节,而是使用 anExecutorService来为他们处理。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();
于 2012-09-03T22:46:09.200 回答
20

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

于 2016-11-02T18:58:55.720 回答
15

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

于 2017-02-09T16:57:01.183 回答
8

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

于 2012-09-03T23:43:11.023 回答
4

CountdownLatch允许您将 Item 的实现更改为可能提交给 Executor 服务,而不是直接使用 Threads。

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

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

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

而这 -> A CountDownLatch 的 latch.await() 方法与 Thread.join()

于 2012-09-03T22:51:10.863 回答