Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java join和CountDownLatch之间有什么区别?_Java_Multithreading_Countdownlatch - Fatal编程技术网

Java join和CountDownLatch之间有什么区别?

Java join和CountDownLatch之间有什么区别?,java,multithreading,countdownlatch,Java,Multithreading,Countdownlatch,当等待其他线程完成时,我们可以使用join或CountdownLatch。使用这两种机制的优缺点是什么?如果您自己处理线程,则只能使用线程。加入。大多数人选择不直接处理线程处理的细节,而是使用ExecutorServices不会直接显示它们是如何执行任务的,因此您必须使用CountDownLatch:(假设您不想只关闭整个服务,也就是说。) ExecutorService=Executors.newFixedThreadPool(5); 最终倒计时闩锁=新倒计时闩锁(5); 对于(int x=0

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

如果您自己处理线程,则只能使用
线程。加入
。大多数人选择不直接处理线程处理的细节,而是使用
ExecutorService
s不会直接显示它们是如何执行任务的,因此您必须使用
CountDownLatch
:(假设您不想只
关闭整个服务,也就是说。)

ExecutorService=Executors.newFixedThreadPool(5);
最终倒计时闩锁=新倒计时闩锁(5);
对于(int x=0;x<5;x++){
提交(新的Runnable(){
公开募捐{
//做点什么
倒计时();
}
});
}
satch.wait();

CountdownLatch
允许您将项的实现更改为可能提交到执行器服务,而不是直接使用线程

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

  • 我们可以使多个线程同时启动
  • 我们可以等待 要完成的几个线程(例如,
    Thread.join()
    方法仅允许您等待单个线程)
  • 你可以看看这个->

    而这个->

    倒计时锁存器是面向任务的,它与线程无关。一整堆不相关的任务集可以提交给线程池,而CountdownLatch将确保每个任务集都通知发起人完成。Join()是一个恼人的缩写,它将任务链接到线程,简单地说,根本就不应该输入该语言。遗憾的是,大量的线程教程在第一页提到了Join(),从而将线程作为死锁生成器介绍给新手,并产生了线程恐惧:(

    另一个区别是在
    Join()之后)
    ,只有当连接的线程已完成其执行时,线程才能解除阻止,而在
    CountDownLatch
    中,线程可以根据任何条件在线程完成时或两者之间的任何时间减少计数。

    通过这种方式,我们可以更好地控制线程的解锁,而不是仅仅依赖于连接线程的完成。

    join()正在等待另一个线程完成,而CountDownLatch是为其他目的而设计的。如果使用CountDownLatch,您不必像使用join()那样拥有正在等待的线程的引用。假设您希望在至少有2名玩家可用的情况下启动游戏。在这种情况下,您可以使用countdownlatch。但使用join无法轻松实现此目标,因为您没有其他线程(在这种情况下为玩家)可供编写join().

    CountDownLatch
    提供线程之间的协调。@veer-1)这取决于您如何使用它。2) 很明显,OP并没有为此目的使用它——“当等待其他线程完成时……”2可以通过循环每个正在使用的
    线程,并调用
    join
    来完成。
    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();