首页 > 其他分享 >CountDownLatch 应用场景

CountDownLatch 应用场景

时间:2024-06-06 12:54:56浏览次数:13  
标签:场景 Thread countDownLatch System 应用 CountDownLatch println new out

CountDownLatch 倒计数器,是多线程并发时使用的类。

主要有2个应用场景:协调子线程结束和子线程开始

场景1:协调子线程结束,等待所有子线程结束

countDown() 执行多次 -》 await() 执行一次

例如:组织4个人开会,所有人员都到齐就开始

public class CountDownLatchTest1 {
    public static void main(String[] args) throws InterruptedException {
        //倒计数4个
        CountDownLatch countDownLatch = new CountDownLatch(4);
        Thread f1 = new Thread(()->{
            countDownLatch.countDown();
            System.out.println("f1 ok");
        });
        Thread f2 = new Thread(()->{
            countDownLatch.countDown();
            System.out.println("f2 ok");

        });
        Thread f3 = new Thread(()->{
            countDownLatch.countDown();
            System.out.println("f3 ok");
        });
        Thread f4 = new Thread(()->{
            try {
                System.out.println("f4在上卫生间,马上到");
                Thread.sleep(1500);
                System.out.println("f4上完卫生间了");
                countDownLatch.countDown();
                System.out.println("f4 ok");
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });

        f1.start();
        f2.start();
        f3.start();
        f4.start();
        System.out.println("所有人都通知了");
        countDownLatch.await();
        System.out.println("人员到齐开会");
    }
}

 

场景2:协调子线程开始,统一各线程的开始时机

await() 执行多次 -》countDown() 执行一次

例如:比赛时,发令枪响了,就开始

public class CountDownLatchTest2 {
    public static void main(String[] args) throws InterruptedException {
        //这里设置1个计数,所有线程等待这1个计数
        CountDownLatch countDownLatch = new CountDownLatch(1);
        Thread f1 = new Thread(()->{
            System.out.println("f1 等待");
            waitToFight(countDownLatch);
            System.out.println("f1 出发");
        });

        Thread f2 = new Thread(()->{
            System.out.println("f2 等待");
            waitToFight(countDownLatch);
            System.out.println("f2 出发");

        });

        Thread f3 = new Thread(()->{
            System.out.println("f3 等待");
            waitToFight(countDownLatch);
            System.out.println("f3 出发");

        });

        Thread f4 = new Thread(()->{
            System.out.println("f4 等待");
            waitToFight(countDownLatch);
            System.out.println("f4 出发");

        });

        f1.start();
        f2.start();
        f3.start();
        f4.start();
        System.out.println("倒计时5秒");
        Thread.sleep(5000);
        countDownLatch.countDown();
        System.out.println("比赛开始");
    }

    //调用countDownLatch等待
    private static void waitToFight(CountDownLatch countDownLatch){
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

 

核心方法:

方法功能
await() 等待latch为0
await(long timeout, TimeUnit unit) 等待latch为0,或者超时
countDown() latch数减1
getCount() 获取当前latch数

标签:场景,Thread,countDownLatch,System,应用,CountDownLatch,println,new,out
From: https://www.cnblogs.com/etangyushan/p/18234924

相关文章

  • 高效论文生成:AI工具在学术写作中的应用与优势
    在学术探索的征途中,AI论文工具本应是助力前行的风帆,而非让人陷入困境的漩涡。我完全理解大家在面对论文压力的同时,遭遇不靠谱AI工具的沮丧与无奈。毕竟,时间可以被浪费,但金钱和信任却不可轻弃。作为一名资深的AI工具探索者,我在此分享一些经过我亲自验证、值得信赖的AI论文辅助......
  • AI写作时代:AI论文工具的高效应用指南
    众所周知,写论文是一项极其耗时间的事情,从开始的选题到文献资料搜索查阅,大纲整理等等一大堆的繁杂工作是极艰辛的。用AI写论文就不一样了,自动化生成文本为你节省了大量时间。优秀的AI工具生成的论文非常完备,能提供摘要、参考文献、致谢等材料参考,而且还查重率低,在5%左右。总体来......
  • 论文AI痕迹减少:AI工具在学术写作中的应用
    告诉大家一个非常残忍的答案,以后所有论文都会被查ai的。在考虑使用AI撰写学术论文的便捷性时,你可能会问:学术界难道没有预见到这种行为吗?答案是肯定的。学术界不仅关注传统的抄袭问题,还针对AI生成内容(AIGC)增加了一项名为“AIGC检测”的指标。这一检测的目的,正是为了识别和惩处......
  • >>>0是一个位操作符,具体解释一下,并给出几个使用示例和常见场景
    >>>是JavaScript中的无符号右移位运算符。它将操作数的所有位向右移动指定位数,丢弃被移出的位,并在左侧填充零。特别地,>>>0是一个常用的技巧,用于确保任何数字(包括负数)都被转换为无符号的32位整数。这意味着结果总是非负的,并且范围在0到2^32-1之间。具体解释符号位处理:在二进......
  • Poll机制实现以及应用实例
    目录poll机制概要说明测试程序:驱动程序:poll机制概要说明Linux系统中的poll 机制是一种I/O多路复用技术,它允许程序同时监控多个文件描述符(filedescriptors),以确定哪些文件描述符已经准备好进行读取、写入或出现错误。poll 机制提供了一种高效的方式来处理并发的I/O......
  • 递归在多级数据结构中的简单应用
    哈喽,我是小码,半年多没更新了,这段时间换了新工作,工作也很忙。后续会尽量多写点,坚持确实是一件很难,很酷的事情。最近在公司负责开发商品有关的开发,商品包含类型、款式等属性,而类型可能有一级类型、二级类型甚至是三级类型,针对这种多级分类,这就就不好使用简单的查询了。之前也写了一......
  • 界面控件Telerik UI for WPF中文教程 - 用RadSvgImage升级应用程序UI
    TelerikUIforWPF拥有超过100个控件来创建美观、高性能的桌面应用程序,同时还能快速构建企业级办公WPF应用程序。UIforWPF支持MVVM、触摸等,创建的应用程序可靠且结构良好,非常容易维护,其直观的API将无缝地集成VisualStudio工具箱中。TelerikUIforWPF中的RadSvgImage组件使......
  • 无需搭建环境,零门槛带你体验Open-Sora文生视频应用
    本文分享自华为云社区《Open-Sora文生视频原来在AIGallery上也能体验了》,作者:码上开花_Lancer。体验链接:Open-Sora文生视频案例体验不久前,OpenAISora凭借其惊人的视频生成效果迅速走红,在一堆文本转视频模型中脱颖而出,成为全球关注的焦点。之后,Colossal-AI团队又推出了新的......
  • SQL注入的业务场景以及危害
    SQL注入的业务场景以及危害在现代Web应用中,数据库是存储和检索数据的核心组件。然而,当Web应用未能正确验证和过滤用户输入时,就可能会遭受SQL注入攻击。SQL注入是一种严重的安全漏洞,它允许攻击者执行恶意的SQL代码,进而获取、修改或删除数据库中的数据,甚至控制整个服务器。本文将探......
  • 用python写一个提取微信群的关键信息应用
    要提取微信群的关键信息,我们可以使用Python编写一个微信聊天记录爬虫,然后分析聊天记录提取关键信息。以下是一个简单的示例:1.安装所需库:```bashpipinstallwxpypipinstallbeautifulsoup4pipinstallrequests```2.编写微信聊天记录爬虫:```pythonimportwxpyimp......