当前位置: 首页 > news >正文

并发编程-CountDownLatch

       ‌CountDownLatch是Java并发编程中用于协调多个线程执行顺序的工具类‌,其核心机制是通过一个共享的计数器控制线程的阻塞与唤醒。它通过计数器来实现,初始值为线程的数量。每当一个线程完成了自己的任务,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已执行完毕,然后在等待的线程就可以恢复执行任务。

        CountDownLatch核心的API见如下:

API说明
CountDownLatch(int count)count为计数器的初始值,通常为需要等待的线程数量
countDown()线程调用一次,计数器值-1,直到count被减为0,代表所有线程全部执行完毕
await()阻塞等待,直到计数器归零

        CountDownLatch典型的应用场景:

        1、其他线程等待子任务结束

        示例代码演示购买家具流程,发货线程需要等待支付线程和家具组装线程结束后才执行,代码如下:

package com.gingko.thread.countdownlatch;
import java.util.concurrent.CountDownLatch;public class CountDownLatchDemo {public static void main(String[] args) {CountDownLatch countDownLatch = new CountDownLatch(2);//支付线程new Thread(() -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("购买家具,支付金额...");countDownLatch.countDown();}).start();//组装家具线程new Thread(() -> {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("组装家具...");countDownLatch.countDown();}).start();//发货线程new Thread(() -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}try {countDownLatch.await();//等待【支付线程】和【组装家具线程】运行结束} catch (InterruptedException e) {e.printStackTrace();}System.out.println("商品发货给买家...");}).start();}
}

        程序运行结果如下,符合预期:

 

        2、并行任务启动

        示例代码演示了主线程发出秒杀活动开始的信息,其他10个子线程同时开始抢购商品,代码如下:

package com.gingko.thread.countdownlatch;
import java.util.concurrent.CountDownLatch;public class CountDownLatchDemo2 {public static void main(String[] args) {//count=1等待主线程发令秒杀开始CountDownLatch countDownLatch = new CountDownLatch(1);for (int i = 0; i < 10; i++) {//秒杀活动,10个线程同时抢商品,等待秒杀准时开始new Thread(() -> {try {countDownLatch.await();//等待秒杀活动开始System.out.println(Thread.currentThread().getName() + " 开始抢购商品...");} catch (InterruptedException e) {e.printStackTrace();}}).start();}//秒杀活动开始try {Thread.sleep(1000);System.out.println("秒杀活动开始...");countDownLatch.countDown();} catch (InterruptedException e) {e.printStackTrace();}}
}

        程序运行结果如下,符合预期:

 

http://www.lryc.cn/news/590198.html

相关文章:

  • UniApp 多端人脸认证图片上传实现
  • 【PTA数据结构 | C语言版】前缀树的3个操作
  • 关于程序=数据结构+算法这句话最近的一些思考
  • 数字ic后端设计从入门到精通11(含fusion compiler, tcl教学)全定制设计入门
  • Java-数构链表
  • golang语法-----指针
  • 笔试——Day10
  • 简单易懂,什么是连续分配管理方式
  • Qt 将触摸事件转换为鼠标事件(Qt4和Qt5及以上版本)
  • Java线程创建与运行全解析
  • DuckDB 高效导入 IPv6 地址数据的实践与性能对比
  • #Datawhale组队学习#7月-强化学习Task1
  • java解析word文档
  • 使用JS编写一个购物车界面
  • C++ 面向对象
  • 第2章通用的高并发架构设计——2.3 高并发读场景方案2:本地缓存
  • 开源 python 应用 开发(七)数据可视化
  • Linux 定时器应用示例(修正版)
  • GIT版本回退
  • Python中可以反转的数据类型
  • GaussDB 数据库架构师修炼(五) 存储容量评估
  • 搜索框的显示与隐藏(展开与收起)
  • el-input 回显怎么用符号¥和变量拼接展示?
  • openEuler 22.03 LTS Rootless Docker 安装指南
  • MongoDB复杂查询 聚合框架
  • 洛谷 P11247 [GESP202409 六级] 算法学习-普及/提高-
  • pymongo库:简易方式存取数据
  • ETL还是ELT,大数据处理怎么选更靠谱?
  • 步态循环(Gait Cycle)
  • 【MySQL事务和锁】回顾事务