• CountDownLatch(应对并发问题的工具类)


    CountDownLatch

    CountDownLatch允许一个或多个线程等待其他线程完成操作以后,再执行当前线程;比如我们在主线程需要开启2个其他线程,当其他的线程执行完毕以后我们再去执行主线程,针对这

    个需求我们就可以使用CountDownLatch来进行实现。CountDownLatch中count down是倒着数数的意思;CountDownLatch是通过一个计数器来实现的,每当一个线程完成了自己的

    任务后,可以调用countDown()方法让计数器-1,当计数器到达0时,调用CountDownLatch的await()方法的线程阻塞状态解除,继续执行。

    CountDownLatch的相关方法

    public CountDownLatch(int count)						// 初始化一个指定计数器的CountDownLatch对象
    public void await() throws InterruptedException			// 让当前线程等待
    public void countDown()									// 计数器进行减1
    

    案例演示:使用CountDownLatch完成上述需求(我们在主线程需要开启2个其他线程,当其他的线程执行完毕以后我们再去执行主线程)

    实现思路:在main方法中创建一个CountDownLatch对象,把这个对象作为作为参数传递给其他的两个任务线程

    线程任务类1

    public class CountDownLatchThread01 implements Runnable {
    
        // CountDownLatch类型成员变量
        private CountDownLatch countDownLatch ;
        public CountDownLatchThread01(CountDownLatch countDownLatch) {      // 构造方法的作用:接收CountDownLatch对象
            this.countDownLatch = countDownLatch ;
        }
    
        @Override
        public void run() {
    
            try {
                Thread.sleep(10000);
                System.out.println("10秒以后执行了CountDownLatchThread01......");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            // 调用CountDownLatch对象的countDown方法对计数器进行-1操作
            countDownLatch.countDown();
    
        }
    
    }
    

    线程任务类2

    public class CountDownLatchThread02 implements Runnable {
    
        // CountDownLatch类型成员变量
        private CountDownLatch countDownLatch ;
        public CountDownLatchThread02(CountDownLatch countDownLatch) {      // 构造方法的作用:接收CountDownLatch对象
            this.countDownLatch = countDownLatch ;
        }
    
        @Override
        public void run() {
    
            try {
                Thread.sleep(3000);
                System.out.println("3秒以后执行了CountDownLatchThread02......");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            // 调用CountDownLatch对象的countDown方法对计数器进行-1操作
            countDownLatch.countDown();
    
        }
    
    }
    

    测试类

    public class CountDownLatchDemo01 {
    
        public static void main(String[] args) {
    
            //  1. 创建一个CountDownLatch对象
            CountDownLatch countDownLatch = new CountDownLatch(2) ;                 // CountDownLatch中的计数器的默认值就是2
    
            //  2. 创建线程任务类对象,并且把这个CountDownLatch对象作为构造方法的参数进行传递
            CountDownLatchThread01 countDownLatchThread01 = new CountDownLatchThread01(countDownLatch) ;
    
            //  3. 创建线程任务类对象,并且把这个CountDownLatch对象作为构造方法的参数进行传递
            CountDownLatchThread02 countDownLatchThread02 = new CountDownLatchThread02(countDownLatch) ;
    
            //  4. 创建线程对象,并启动线程
            Thread t1 = new Thread(countDownLatchThread01);
            Thread t2 = new Thread(countDownLatchThread02);
            t1.start();
            t2.start();
    
            //  5. 在主线程中调用 CountDownLatch中的await让主线程处于阻塞状态
            try {
                countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            //  6. 程序结束的输出
            System.out.println("主线程执行了.... 程序结束了......");
        }
    
    }
    

    控制台输出结果

    3秒以后执行了CountDownLatchThread02......
    10秒以后执行了CountDownLatchThread01......
    主线程执行了.... 程序结束了......
    

    CountDownLatchThread02线程先执行完毕,此时计数器-1;CountDownLatchThread01线程执行完毕,此时计数器-1;当计数器的值为0的时候,主线程阻塞状态接触,主线程向下执行。

  • 相关阅读:
    数据中心机房供电配电及能效管理系统设计
    基于邻接矩阵的广度优先遍历
    JS之函数的属性
    【DL with Pytorch】第 2 章 : 神经网络的构建块
    Linux网络:关于TCP / IP 五层协议栈的总结
    EN 16034门窗及配件—CE认证
    【Leetcode】剑指Offer10:斐波那契数列
    MySQL-内置函数
    C 语言获取文件绝对路径
    【图卷积神经网络】1-入门篇:为什么使用图神经网络
  • 原文地址:https://blog.csdn.net/2302_79020600/article/details/139860462