千家信息网

如何正确的使用CountDownLatch

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,本篇文章给大家分享的是有关如何正确的使用CountDownLatch,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。public clas
千家信息网最后更新 2025年01月23日如何正确的使用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安全错误 数据库的锁怎样保障安全 鑫盛科技网络技术有限公司 网络安全项目经理日常工作 计算机网络安全情况汇报 为什么要学数据库系统原理 关于网络安全的句子和名言 数据中心大二层网络技术详解 电脑软件开发哪个语言 厦门斯塔克网络技术有限公司薪资 imax无线网络技术 无法验证服务器的身份ios 七日杀本地服务器和联机 unix mysql数据库搬迁 东营管理系统软件开发哪家靠谱 学生软件开发公司 网络技术标准与协议讲解 软件开发模式有什么 山西通用软件开发厂家报价 华为投资服务器品牌 无法登录远程服务器 校园网络技术总结 客户端连接镜像数据库 互联网科技物业管理核心能力 双生视界手游官方服务器 足球队 数据库设计 重庆安卓软件开发定制费用 软件开发工程师工作量 数据库重复记录只显示一条 大厅强管理优服务器 怎么做魔兽世界手游的服务器 大学计算机建立数据库表
0