zoukankan      html  css  js  c++  java
  • 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("老板发工资了!!!!");
        }
    }
    

        
       
        
       

  • 相关阅读:
    NOsql总结
    关于Swift中的指针的那些事
    并发控制的概念
    并发控制--Concurrency control--乐观、悲观及方法
    数据库的三大系统
    数据库沉思录
    代码结构化(分层)阅读
    代码阅读困难的原因
    数据库锁与并发
    SQLite事务、错误与自动回滚
  • 原文地址:https://www.cnblogs.com/zhangXingSheng/p/13677639.html
Copyright © 2011-2022 走看看