千家信息网

如何正确的使用CountDownLatch

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本篇文章给大家分享的是有关如何正确的使用CountDownLatch,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。public clas
千家信息网最后更新 2026年10月31日如何正确的使用CountDownLatch

本篇文章给大家分享的是有关如何正确的使用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,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

线程 方法 阻塞 选手 运行 作用 注释 结果 就是 比赛 验证 代码 代表 参数 更多 次数 知识 篇文章 裁判 不同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 华服互联网科技靠谱吗 涨乐互联网科技 互联网科技垄断 致骋互联网科技 广西互联网科技公司 丰台科技园 互联网公司 四个字互联网科技公司取名 互联网和高科技公司 互联网科技教育视频 广州恒生互联网科技有限 广州市恰铎互联网科技有限公司 电子科技大学互联网创业大赛 烟台灵鸽互联网科技有限公司 合肥互联网科技公司公章图片 富国互联网金融科技混合基金 有人说阿里系是互联网科技企业 广州梦谷互联网科技有限公司领导 马化腾互联网科技教学 互联网大会出现的黑科技 互联网科技快速发展优美句子 手冲咖啡和咖啡机区别 什么是科技互联网 互联网科技公司发展 云电互联网科技 互联网科技公司做什么 互联网科技有限公司 翻译 深圳卡尔迅互联网科技有限公司怎么样 互联网科技实习生岗位职责 互联网科技大赛获奖感言 万物互联网智能科技
0