首页 > 编程语言 >Java并发工具类CountDownLatch(倒计数器)

Java并发工具类CountDownLatch(倒计数器)

时间:2023-10-21 13:31:59浏览次数:46  
标签:Java Thread CountDownLatch start 计数器 线程 countDownLatch new

CountDownLatch,倒计数器,有两个常见的应用场景:

场景1:协调子线程结束动作:等待所有子线程运行结束

CountDownLatch允许一个或多个线程等待其他线程完成操作。

例如,我们很多人喜欢玩的王者荣耀,开黑的时候,得等所有人都上线之后,才能开打。

Java并发工具类CountDownLatch(倒计数器)_System

CountDownLatch模仿这个场景:

创建大乔、兰陵王、安其拉、哪吒和铠等五个玩家,主线程必须在他们都完成确认后,才可以继续运行。

在这段代码中, new CountDownLatch(5) 用户创建初始的latch数量,各玩家通过countDownLatch.countDown() 完成状态确认,主线程通过countDownLatch.await() 等待。

public static void main(String[] args) throws InterruptedException {
  CountDownLatch countDownLatch = new
  CountDownLatch(5);
  Thread 大乔 = new Thread(countDownLatch::countDown);
  Thread 兰陵王 = new Thread(countDownLatch::countDown);
  Thread 安其拉 = new Thread(countDownLatch::countDown);
    Thread 哪吒 = new Thread(countDownLatch::countDown);
  Thread 铠 = new Thread(() -> {
    try {
    // 稍等,上个卫生间,马上到...
    Thread.sleep(1500);
    countDownLatch.countDown();
    } catch (InterruptedException ignored) {}
  });
  大乔.start();
  兰陵王.start();
  安其拉.start();
  哪吒.start();
  铠.start();
  countDownLatch.await();
  System.out.println("所有玩家已经就位!");
}

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

王者游戏中也有类似的场景,游戏开始时,各玩家的初始状态必须一致。不能有的玩家都出完装了,有的才降生。

所以大家得一块出生,在这个场景中,仍然用五个线程代表大乔、兰陵王、安其拉、哪吒和铠等五个玩家。需要注意的是,各玩家虽然都调用了start() 线程,但是它们在运行时都在等待countDownLatch 的信号,在信号未收到前,它们不会往下执行。

public static void main(String[] args) throws InterruptedException {
  CountDownLatch countDownLatch = new CountDownLatch(1);
  Thread 大乔 = new Thread(() ->
  waitToFight(countDownLatch));
  Thread 兰陵王 = new Thread(() ->
  waitToFight(countDownLatch));
  Thread 安其拉 = new Thread(() ->
  waitToFight(countDownLatch));
  Thread 哪吒 = new Thread(() ->
  waitToFight(countDownLatch));
  Thread 铠 = new Thread(() ->
  waitToFight(countDownLatch));
  大乔.start();
  兰陵王.start();
  安其拉.start();
  哪吒.start();
  铠.start();
  Thread.sleep(1000);
  countDownLatch.countDown();
  System.out.println("敌方还有5秒达到战场,全军出击!");
  }
  private static void waitToFight(CountDownLatch countDownLatch) {
  try {
    countDownLatch.await(); // 在此等待信号再继续
    System.out.println("收到,发起进攻!");
    } catch (InterruptedException e) {
    e.printStackTrace();
  }
}

CountDownLatch的核心方法也不多:

await() :等待latch降为0;

boolean await(long timeout, TimeUnit unit) :等待latch降为0,但是可以设置超时时间。比如有玩家超时未确认,那就重新匹配,总不能为了某个玩家等到天荒地老。

countDown() :latch数量减1;

getCount() :获取当前的latch数量。

标签:Java,Thread,CountDownLatch,start,计数器,线程,countDownLatch,new
From: https://blog.51cto.com/u_16269508/7966709

相关文章

  • Java 项目引入logback
    参考文档:https://www.cnblogs.com/songxingzhu/p/10119378.html <!--BeginLogBackLog--><!--https://mvnrepository.com/artifact/ch.qos.logback/logback-classic--><dependency><groupId>ch.qos.logback</g......
  • java项目实践-jsp-finter-监听器-day19
    目录1.jsp2.过滤器3.listener监听器1.jspservle逻辑处理方便html页面表现麻烦jsp页面表现方便但是逻辑处理麻烦JSP是一种页面技术JSP本质上是servlet类通过JSP引擎翻译成servletjsp约等于java+html注意:jsp不是访问静态的html文件index.jsp修改成如下代码:<%-......
  • javaparser java 源码扫描解析
    参考文档:https://www.bilibili.com/read/cv22893728/ 使用到的以来:<dependency><groupId>com.github.javaparser</groupId><artifactId>javaparser-core</artifactId><version>3.25.5</version></dependency>......
  • 基于Java的健身运动网站设计与实现
    (文章目录)具体实现截图主要功能:基于java(ssm)健身运动网站系统系统分为用户和管理员两个角色用户的主要功能有:1.用户注册和登陆系统2.查看健身知识3.查看健身器材介绍信息4.查看健身教练,在线预约教练5.查看健身课程,在线购买课程信息6.查看健身商品信息,在线购买健身商品,......
  • Java零基础入门-常量
    前言在学习Java语言的过程中,常量是一个非常重要的概念。它不仅在代码中被广泛应用,而且在Java面试中也是被常问到的知识点。因此,本篇文章将着重介绍Java中常量的相关知识,希望能够帮助Java初学者更好地掌握这个概念。摘要本文主要介绍Java中的常量。首先,我们将讲解常量的概念和作......
  • Java零基础入门-包装类
    前言Java是一种广泛使用的面向对象编程语言,它通过JVM(Java虚拟机)来实现跨平台。如果您刚刚开始学习Java编程语言,那么您可能会发现Java中的包装类是一个挑战。本文将对Java中的包装类进行详细介绍,以帮助您更好地理解Java编程语言。摘要在Java编程语言中,包装类用于将基本数据类型转......
  • Java零基础入门-自动拆箱
    前言Java作为目前最流行的编程语言之一,受到广泛的关注和应用。但是对于零基础的Java初学者来说,由于其语言复杂度较高,入门难度较大。特别是在处理数据类型时,自动拆箱这个概念更是容易让人产生困惑。因此,本文旨在对Java中的自动拆箱进行详细讲解,帮助初学者更好地理解和运用Java语言......
  • 10.18 Java异常处理2
     以上便是Java中异常的基本代码结构,其中,Java中所有异常都派生于excption以下是jdk中与异常相关的类。 ......
  • Java 实现结巴分词
    pom.xml引入结巴分词maven依赖<dependency> <groupId>com.huaban</groupId> <artifactId>jieba-analysis</artifactId> <version>1.0.2</version></dependency>测试@Testpublicvoidtest(){StringgoodsNa......
  • 10.17 Java异常处理1
     eg:importjavax.swing.*;classAboutException{publicstaticvoidmain(String[]a){inti=1,j=0,k;k=i/j;try{k=i/j;//Causesdivision-by-zeroexception//thrownewException("Hello.Exception!&quo......