CountDownLatch 简介

  CountDownLatch 是一个同步工具,允许一个或多个线程 等待其他线程(一个或多个线程)完成一组操做。

  CountDownLatch 中的方法不多:

 

 

public CountDownLatch(int count) 构造方法 count 是同步计数的初始值

public void countDown()

递减count值 递减计数器,每次减1,当count为0时,释放所有堵塞线程
public boolean await(long timeout, TimeUnit unit) 堵塞线程

堵塞当前线程,直到count计数为0。

该方法有返回值:true 计数器=0, false 计数器>0

timeout:超时时间,当超过这个时间,将不再等待其他线程(不再堵塞当前线程)

TimeUnit:等待时间的单为

public void await() 堵塞线程 堵塞当前线程,直到count计数为0。
public long getCount() 获取当前count计数  

 

例子:老板雇佣了10个工人,当10个工人都工作完后,通知老板来检查,然后发工资

   先看执行结果:

老板分配工作
工人0:工作用了8分钟
工人5:工作用了8分钟
工人6:工作用了5分钟
工人4:工作用了5分钟
工人1:工作用了7分钟
工人3:工作用了6分钟
工人2:工作用了8分钟
工人8:工作用了8分钟
老板去吃饭,一会查看工作
工人7:工作用了7分钟
工人9:工作用了8分钟
工人4: 干完活
工人6: 干完活
工人3: 干完活
工人1: 干完活
工人7: 干完活
工人0: 干完活
工人2: 干完活
工人9: 干完活
工人5: 干完活
工人8: 干完活
老板发工资了!!!!

  示例代码:

public class CountdownLatchTest1 {

    public static void main(String[] args) {
        // 雇佣人数
        int workCount = 10;
        CountDownLatch countDownLatch = new CountDownLatch(workCount);
        System.out.println("老板分配工作");
        for (int i = 0; i < workCount; i++) {
            Thread thread = new Thread("工人" + i) {
                @Override
                public void run() {
                    workTime();
                    System.out.println(Thread.currentThread().getName() + ": 干完活");
                    countDownLatch.countDown();
                }
            };
            // 开始工作
            thread.start();
        }

        try {
            System.out.println("老板去吃饭,一会查看工作");
            // 等待其他工人工作完
            countDownLatch.await();
            // 通知老板发工资
            money();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 随机计算工人的工作时间
     */
    public static void workTime() {
        try {
            int sleep = (int) (5 + Math.random() * (5 - 1 + 1));
            System.out.println(Thread.currentThread().getName() + ":工作用了" + sleep + "分钟");
            TimeUnit.SECONDS.sleep(sleep);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 发工资
     */
    public static void money() {
        System.out.println("老板发工资了!!!!");
    }
}

 

    
   
    
   

posted @ 2020-09-16 10:21  卖臭豆腐喽  阅读(176)  评论(0编辑  收藏  举报