CountDownLatch 的 .await() 的线程阻塞 和countDown() 计时唤醒_countdownlatch.await()-程序员宅基地

技术标签: Java基础  

CountDownLatch是一种java.util.concurrent包下一个同步工具类,它允许一个或多个线程等待直到在其他线程中一组操作执行完成。

CountDownLatch的用法非常简单,下面的例子也是我在网上看到的,十分贴切,这里就贴出来

 

public class Test {

    public static void main(String[] args) {
       CountDownLatch begin = new CountDownLatch(1);
       CountDownLatch end = new CountDownLatch(2);

       for(int i=0; i<2; i++){
           Thread thread = new Thread(new Player(begin,end));
           thread.start();
       }

       try{
           System.out.println("the race begin");
           begin.countDown();
           end.await();
           System.out.println("the race end");
       }catch(Exception e){
            e.printStackTrace();
       }

    }
}


/**
 * 选手
 */
class Player implements Runnable{

    private CountDownLatch begin;

    private CountDownLatch end;

    Player(CountDownLatch begin,CountDownLatch end){
        this.begin = begin;
        this.end = end;
    }

    public void run() {
        
        try {
            begin.await();
            System.out.println(Thread.currentThread().getName() + " arrived !");;
            end.countDown();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

下面是运行结果

可以看到 通过CountDownLatch 的使用  我们控制了线程的执行顺序

在上面代码中,我们使用到await()方法  和  countDown()  方法 。我们验证一下它们各自的作用。

首先  验证await() 方法。将main方法中的 end.await() 注释掉,下面是注释掉后的运行结果

 

可以看到主线程没有等待代表选手的线程结束,直接宣布比赛结束了!刚开始就结束的比赛- -

这里可以看出,await() 方法具有阻塞作用

 

其次  我们来验证countDown方法,将代表选手线程中的 end.countDown() 进行注释,下面是运行结果

 

程序一直在运行,所有选手都已经到了终点,但是裁判就是不宣传比赛结束,他在等什么呢?

我们猜测countDown() 方法具有唤醒阻塞线程的作用。

那我们也许会问,既然有唤醒阻塞线程的作用,那么我们只调用一次countDown()  方法不就是可以唤醒被阻塞的主线程了吗?

我们试一下,取消上面coutDown()的注释,再次创建一个选手,代码如下

class Player2 implements Runnable{

        private CountDownLatch begin;

        private CountDownLatch end;

        Player2(CountDownLatch begin,CountDownLatch end){
            this.begin = begin;
            this.end = end;
        }

        public void run() {
            
            try {
                begin.await();
                System.out.println(Thread.currentThread().getName() + " arrived !");
//                end.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

 

main 方法也修改如下,创建了两个不同的选手

public static void main(String[] args)
    {
        CountDownLatch begin = new CountDownLatch(1);
        CountDownLatch end = new CountDownLatch(2);
        
        Thread thread = new Thread(new Player(begin, end));
        thread.start();
        
        Thread thread2 = new Thread(new Player2(begin, end));
        thread2.start();
        
        try
        {
            System.out.println("the race begin");
            begin.countDown();
            end.await();
            System.out.println("the race end");
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        
    }

运行一下,下面是结果

主程序一直阻塞,没有被唤醒,裁判上厕所上得有点久啊!

这样看来countDown() 并不是直接唤醒线程,有点像一个计数器,倒计时的那种。

查看API文档,果然,我们在构造函数中添加了参数2,就需要调用 2 次 countDown()  才能将 end.await() 阻塞的线程唤醒。

CountDownLatch end = new CountDownLatch(2);

 

总结一下,

  1、CountDownLatch end = new CountDownLatch(N); //构造对象时候 需要传入参数N

  2、end.await()  能够阻塞线程 直到调用N次end.countDown() 方法才释放线程

  3、end.countDown() 可以在多个线程中调用  计算调用次数是所有线程调用次数的总和

 

countDownLatch.await()与thread.join()区别
https://blog.csdn.net/u012501054/article/details/83410761

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011441473/article/details/103072449

智能推荐

flink - kafka producer 实现多分区发送数据到consumer,进行消费_flinkkafkaproducer010-程序员宅基地

文章浏览阅读2k次。先建立好分区的topickafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 3 --topic flinkwrite5建立分区为3 ,并行度为3 的producer2.然后在flink中连接这个topictreamExecutionEnvironment..._flinkkafkaproducer010

分时操作系统和多道程序操作系统的区别_分时系统和多道程序系统的区别是什么-程序员宅基地

文章浏览阅读1.2w次,点赞15次,收藏33次。分时操作系统和多道程序操作系统的区别 多道程序系统是在计算机内存中同时存放几道相互独立的程序,使它们在管理程序控制之下,相互穿插的运行。 两个或两个以上程序在计算机系统中同处于开始和结束之间的状态。这就称为多道程序技术运行的特征:多道、宏观上并行、微观上串行。 多道程序设计指的是允许多个程序同时进入一个计算机系统的主存储器并启动进行计算的方法。也就是说,计算_分时系统和多道程序系统的区别是什么

Mybatis常用标签详解_mybatis标签详解-程序员宅基地

文章浏览阅读1.1w次,点赞29次,收藏167次。MyBatis 真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis致力于减少使用成本,让用户能更专注于 SQL 代码。_mybatis标签详解

Android 监听音频焦点变化-程序员宅基地

文章浏览阅读468次,点赞22次,收藏16次。在 Android 中,监听音频焦点变化意味着您可以获得关于音频焦点状态的通知,并针对焦点变化执行相应的操作。音频焦点是指哪个应用程序或组件有权播放音频的能力。

Linux基础之初识SHELL脚本_shell脚本-gf-程序员宅基地

文章浏览阅读10w+次。Shell脚本(Shell Script )可以简单理解为多个LINUX命令的堆砌,与Windows/Dos下的批处理相似_shell脚本-gf

IPD思想指导下的企业研发管理成熟度演进模型-程序员宅基地

文章浏览阅读2.4k次。基于IPD研究(书籍、网络文章、个人实践),参考CMMI框架,输出本研发管理能力成熟度框架。_研发管理成熟度

随便推点

解决:etwork unreachable resolving问题_network unreachable resolving-程序员宅基地

文章浏览阅读2.1k次。系统: CentOS Linux release 7.7.1908 (Core)bind: BIND 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6部署使用bind后, 使用systemctl status named或者查看messages日志,都能看到Jul 12 06:08:40 od-bind-81 named[994]: network unreachable resolving 'gateway/A/IN': 2001:500:12::d0d#53Jul 1_network unreachable resolving

OpenCV的滤波与卷积_opencv accumulate csdn-程序员宅基地

文章浏览阅读4.7k次。目录预备知识滤波、核和卷积边界外推和边界处理阈值化操作Otsu算法自适应阈值平滑简单模糊和方框型滤波器中值滤波器高斯滤波器双边滤波器导数和梯度索贝尔导数Scharr滤波器拉普拉斯变换图像形态学膨胀和腐蚀通用形态学函数开操作和闭操作形态学梯度顶帽和黑帽自定义核用任意线性滤波器做卷积用cv::filter2..._opencv accumulate csdn

虚拟机中ip突然就找不到了_本机使用wifi虚拟机重启后不能显示ip-程序员宅基地

文章浏览阅读1.6w次,点赞46次,收藏110次。虚拟机中ip突然就找不到了前言方法一:方法二:方法三:前言之前在使用虚拟机的时候ip老是找不到,然后今天有出现了,之前的已经解决了。下面我就总结的几个我碰到的解决ip找不到的方法。。。希望对你能够有帮助方法一:查看服务:右击我的电脑->管理->服务和应用程序->服务在“服务”里找到和VMware相关的进程,将VMware NAT Service、VMware DHCP..._本机使用wifi虚拟机重启后不能显示ip

2021-08-03以CSU18MB86芯片做主控开发打气泵方案_csu18p88 气泵方案-程序员宅基地

文章浏览阅读170次。  汽车轮胎打气泵方案功能介绍:    显示方式:LED显示,测量和设置同屏显示。    单位:4个,循环切换顺序PSI、KPA、 Bar、 Kg/cm2    测量范围:    3.0 ~ 150.0PSI; 20 ~ 1030KPA    0.2 ~ 10.30Bar; 0.2 ~ 10.50Kg/cm2    设置范围:    3 ~ 120PSI; 20 ~ 825KPA    0.2 ~ 8.25Bar; 0.2 ~ 10.50 Kg/cm2    测量精度:+_csu18p88 气泵方案

ansible的安装与使用_ansible 认不到已经安装的python-netaddr-程序员宅基地

文章浏览阅读112次。# 安装epel库# yum -y install epel-release# 安装pip,python3自带pip3# yum -y install python-pip# 升级pippip install --upgrade pip# 检查版本pip --versionpip 19.0.3 from /usr/lib/python2.7/site-packages/pip (p..._ansible 认不到已经安装的python-netaddr

sonar-程序员宅基地

文章浏览阅读61次。1.maven的setting.xml中<profiles> <profile> <id>sonar</id> <activation> <activeByDefault>true</activeByDefault> </activation> <proper...

推荐文章

热门文章

相关标签