join和CountDownLatch有什么区别?

Ada*_*Lee 22 java multithreading countdownlatch

在等待其他线程完成时,我们可以使用join或者CountdownLatch.使用这两种机制中的任何一种的利弊是什么?

Jef*_*rey 24

只有Thread.join在自己处理线程时才能使用.大多数人选择不直接处理线程处理的细节,而是使用an 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();
Run Code Online (Sandbox Code Playgroud)


Raj*_*pta 10

另一个区别是join(),只有当联接线程完成其执行时线程才能被解除阻塞,而CountDownLatch线程可以在线程完成时或在基于任何条件之间随时减少计数.
通过这种方式,我们可以更好地控制线程的解锁,而不是仅仅依赖于连接线程的完成.


Mar*_*mes 7

CountdownLatch是面向任务的 - 它与线程无关.可以将一大堆不相关的任务集提交给threadPool,并且CountdownLatch将确保每个集合通知发起者完成.Join()是一个恼人的abberation,它将任务链接到线程,简单地说,应该从来没有输入过该语言.遗憾的是,一大堆热门的线程教程在第一页上提到了Join(),从而将线程引入新手作为死锁生成器并生成线程放克:(


小智 7

join()正在等待另一个线程完成,而CountDownLatch是为另一个目的而设计的.如果使用CountDownLatch,则不必引用您正在等待的线程,因为我们必须使用join().假设你想要至少有2名玩家可以开始游戏.在这种情况下,您可以使用countdownlatch.但是你无法轻松地使用join来实现这一点,因为你没有可以编写join()的另一个线程(本例中为player).