CountDownlatch两种使用模式

88 阅读1分钟

一.让单个线程等待:多个线程(任务)完成后,进行汇总合并

public class CountDownLatchTest {
    public static void main(String[] args) throws InterruptedException {
        final CountDownLatch countDownLatch = new CountDownLatch(10);
        //模拟多线程处理任务
        for (int i = 0; i < 10; i++) {
           new Thread(()-> {
               System.out.println("处理任务");
               try {
                   Thread.sleep(new Random().nextInt(2000));
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               //任务处理完count -1
               countDownLatch.countDown();
           }).start();
        }

        //阻塞,只有count=0时,才会开始处理
        countDownLatch.await();
        //子任务完成,处理逻辑
        System.out.println("汇总,等等其它业务逻辑");
    }
}

执行结果

处理任务
处理任务
处理任务
处理任务
处理任务
汇总,等等其它业务逻辑

二.让多个线程等待:模拟并发,让并发线程一起执行

public class CoundDownLatchTest2 {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(1);

        for (int i = 0; i < 10; i++) {
            int finalI = i;
            new Thread(() -> {
                try {
                    System.out.println(finalI + "号准备完毕!");
                    countDownLatch.await();

                    System.out.println(finalI + "号开始干活!");
                    Thread.sleep(new Random().nextInt(200));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        }

        //模拟等待其它线程准备
        Thread.sleep(2000);
        //发号命令大家一起开始干活
        countDownLatch.countDown();
    }
}

执行结果:

1号准备完毕!
3号准备完毕!
2号准备完毕!
0号准备完毕!
4号准备完毕!
........
1号开始干活!
4号开始干活!
0号开始干活!
2号开始干活!
3号开始干活!