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

CountDownLatch 和 CyclicBarrier 用法以及区别

在使用多线程执行任务时,通常需要在主线程进行阻塞等待,直到所有线程执行完毕,主线程才能继续向下执行,主要有以下几种可选方式

1. 调用 main 线程的 sleep 方法

一般用于预估线程的执行时间,在主线程内执行线程sleep方法阻塞线程,如下方式:

public class Main {public synchronized static void print(){System.out.println("abc");}public static void main(String[] args) throws InterruptedException {for (int i = 0; i < 100; i++) {new Thread(()->{print();}).start();}Thread.sleep(1000);}
}

这种方式的缺点就是,线程执行的时间与数量和其任务执行的长短有关,一般很难去预估。

2. 使用CountDownLatch

CountDownLatch 提供了一个阻塞阀门,当阀门 count 变成 0 时候放行

  • 首先CountDownLatch会初始化线程数量为实际线程的运行数量
  • 每当一个线程执行完毕后,会把count - 1
  • 主线程调用countDownLatch.await()方法进行阻塞,当count == 0时,则所有线程执行完毕,主线程开始继续向下执行
// 100 个线程打印abc, 等到所有线程执行结束, 主线程开始继续向下执行
public class Main {public synchronized static void print(){System.out.println("abc");}public static void main(String[] args) throws InterruptedException {long start = System.currentTimeMillis();// CountDownLatch缺点: CountDownLatch是一次性的, 使用完毕后不能再对其设置值CountDownLatch countDownLatch = new CountDownLatch(100);for (int i = 0; i < 100; i++) {new Thread(()->{// 执行线程任务print();// 执行完毕 --- 将 countDownLatch - 1countDownLatch.countDown();}).start();}// 主线程因为之前的线程没有执行完阻塞在这里// 当所有线程执行完毕后, 主线程会继续执行countDownLatch.await();System.out.println("线程执行结束:");System.out.println("执行时间为: " + (System.currentTimeMillis() - start) + "ms");}
}

3. 使用 CyclicBarrier

CyclicBarrier 也是一种多线程执行时候的控制器,而对于CyclicBarrier来说,重点是那一组N个线程,他们之间任何一个没有完成,所有的线程都必须等待,当计数器到达指定值时,用法如下:

public class Main {public synchronized static void print(){System.out.println("abc");}public static void main(String[] args) {long start = System.currentTimeMillis();// CyclicBarrier 线程执行控制器 --- 可重用// 当所有线程到达栅栏, 然后触发回调函数CyclicBarrier barrier = new CyclicBarrier(100, ()->{long end = System.currentTimeMillis();System.out.println("线程执行结束:");System.out.println("线程执行所需时间:" + (end - start));});for(int i=0; i<100; i++){new Thread(()->{print();try {barrier.await();} catch (InterruptedException | BrokenBarrierException e) {e.printStackTrace();}}).start();}}
}

4. CountDownLatch 和 CyclicBarrier 区别

CountDownLanchCyclicBarrier
减计数方式加计数方式
count为0时释放所有等待的线程计数为指定值时释放所有等待的线程
count为0时可以重置计数置为指定值时,计数为0重新开始
子线程调用countDown()方法将计数器-1,主线程调用await()方法进行阻塞子线程调用await方法将计数器+1,当加后的值不等于指定值,当前线程阻塞
不可重复利用可重复利用

相关文章:

CountDownLatch 和 CyclicBarrier 用法以及区别

在使用多线程执行任务时&#xff0c;通常需要在主线程进行阻塞等待&#xff0c;直到所有线程执行完毕&#xff0c;主线程才能继续向下执行&#xff0c;主要有以下几种可选方式 1. 调用 main 线程的 sleep 方法 一般用于预估线程的执行时间&#xff0c;在主线程内执行线程sleep…...

9.9喝遍“茶、奶、果、酒”,茶饮价格战是因为“无活可整”?

“家人们谁懂啊&#xff0c;周一瑞幸周二奈雪周三茶百道周四库迪周五古茗周六coco&#xff0c;9块9根本喝不完&#xff01;” 紧随咖啡的9.9大战&#xff0c;茶饮们也在今年加速“蜜雪冰城化”&#xff0c;9.9变成了一种潮流。伴随着茶百道、coco、奈雪的茶等品牌把9.9玩出了更…...

echarts 学习网址

1、PPChart 网址&#xff1a;PPChart - 让图表更简单 2、YX-Chartlib 网址&#xff1a;http://chartlib.datains.cn3、isqqw 网址&#xff1a;echarts图表集4、makeapie 网址&#xff1a;makeapie echarts社区图表可视化案例5、Chart.Top 网址&#xff1a;chart.top - 让图…...

android源码编译

整包编译 导入环境变量 source ./build/envsetup.shlunch&#xff1a;选择平台编译选项make&#xff1a;执行编译 编译单个apk 进入到apk mk所在路径 mma...

盘点双电机驱动技术

对于电动汽车来说&#xff0c;双电机相对于单电机加主减速器或变速箱的方案在提高驱动效率方面的优势&#xff1a; 第一&#xff0c;单电机在低速、高速轻载等情况下&#xff0c;效率降低比较严重。 电动机的高效区间虽然比内燃机大得多&#xff0c;但是汽车的转速和转矩要求…...

ubuntu下用pycharm专业版连接AI服务器及其docker环境

一&#xff1a;用pycharm专业版连接AI服务器 1、首先在自己电脑上新建一个文件夹&#xff0c;后续用于映射服务器上自己所要用的项目文件 2、用pycharm专业版打开该文件夹&#xff0c;作为一个项目打开 3、然后在工具->部署->配置 4、配置中形式如下&#xff1a; 点击左…...

IntentFilter笔记

一、action <intent-filter>中可以有多个action&#xff0c;Intent只要匹配其中1个action即匹配成功<intent-filter>没有action&#xff0c;任何Intent无法与之匹配<intent-filter>中有action&#xff0c;Intent中没有action时可以与之匹配成功<intent-fi…...

【二叉树】——链式结构(快速掌握递归与刷题技巧)

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…...

项目管理—项目普遍存在的问题

软件公司有开发业务&#xff0c;在完成一个软件产品或实施项目时&#xff0c;常常会出现以下的状况&#xff1a; 开发人员不懂客户业务&#xff0c;一个高大上的规划&#xff0c;落地后的软件&#xff0c;只是机械的满足了基本功能&#xff0c;毫无易用性和科学性可言。 项目只…...

Ubuntu Seata开机自启动服务

1、创建service文件 在/lib/systemd/system目录下创建seata.service文件 [Unit] Descriptionalibaba seata Afternetwork.target Documentationhttps://seata.io/zh-cn/[Service] Userroot Grouproot Typeforking Environment"JAVA_HOME/usr/local/programs/jdk-8u333-li…...

腾讯mini项目-【指标监控服务重构】2023-08-26

今日已办 Venus 的 Trace 无感化 定义 handler 函数 fiber.Handler 的主要处理逻辑返回处理中出现的 error返回处理中响应 json 的函数 // handler // Description: // Author xzx 2023-08-26 18:00:03 // Param c // Return error // Return func() error : function for …...

《Essential C++》之(面向过程泛型编程)

目录 &#x1f33c;面向过程的编程风格 -- 第2章 &#x1f348;2.2 &#x1f348;2.4 &#x1f348;2.5 &#x1f348;2.6 &#x1f33c;泛型编程风格 -- 第3章 &#x1f34d;3.1 &#x1f34d;3.4 前言 要求 完整代码 输入输出 &#x1f33c;面向过程的编程风…...

机器学习笔记:adaBoost

1 介绍 AdaBoost&#xff08;Adaptive Boosting&#xff09;是一种集成学习方法&#xff0c;它的目标是将多个弱分类器组合成一个强分类器 通过反复修改训练数据的权重&#xff0c;使得之前分类错误的样本在后续的分类器中得到更多的关注每一轮中&#xff0c;都会增加一个新的…...

Anchor DETR

Anchor DETR(AAAI 2022) 改进&#xff1a; 提出了基于anchor的对象查询提出Attention变体-RCDA 在以前DETR中&#xff0c;目标的查询是一组可学习的embedding。然而&#xff0c;每个可学习的embedding都没有明确的意义 &#xff08;因为是随机初始化的&#xff09;&#xff…...

适合在家做的副业 整理5个,有电脑就行

今天&#xff0c;我们不说别的&#xff0c;整理5个适合个人在家单干的副业。需要电脑&#xff0c;如果你没电脑就不用看了&#xff0c;最后两个&#xff0c;我们也在做&#xff0c;你可以看到最后了解。这些副业&#xff0c;大家多去实践操作&#xff0c;前期&#xff0c;每月三…...

Android WebSocket

WS Android WebSocket 资源 名字资源AAR下载GitHub查看Gitee查看 Maven 1.build.grade allprojects {repositories {...maven { url https://jitpack.io }} }2./app/build.grade dependencies {implementation com.github.RelinRan:WS:2022.2023.9.23.1 }初始化 配置权…...

Android 按键流程

一、驱动层流程 主要流程涉及以下文件 kernel/msm-4.19/drivers/input/keyboard/gpio_keys.c kernel/msm-4.19/drivers/input/input.c kernel/msm-4.19/drivers/input/evdev.c kernel/msm-4.19/drivers/input/input-compat.c 有按键动作时&#xff0c;根据 dtsi 中配置 c…...

C语言——运算符

C用运算符表示算术运算。 C没有指数运算符&#xff0c;不过&#xff0c;C的标准数学库提供了一个pow()函数用于指数运算。 基本运算符 赋值运算符&#xff1a; 变量名变量值 从右到左 左值和变量名的区别&#xff1a; 变量名是一个标识符的名称&#xff0c;左值是一个可变…...

MySQL数据库入门到精通8--进阶篇( MySQL管理)

7. MySQL管理 7.1 系统数据库 Mysql数据库安装完成后&#xff0c;自带了一下四个数据库&#xff0c;具体作用如下&#xff1a; 7.2 常用工具 7.2.1 mysql 该mysql不是指mysql服务&#xff0c;而是指mysql的客户端工具。 语法 &#xff1a; mysql [options] [database] 选…...

硬件基本功--MOS管

一、上下拉电阻Rgs的作用 Rgs&#xff1a;经验值&#xff0c;一般取10K左右。 1. 上电时给MOS管的栅极一个确定的电平&#xff0c;防止上电时GPIO为高阻态时&#xff0c;MOS管的栅极电平不确定&#xff0c;从而受到干扰。 2. 断电时&#xff0c;如果MOS管是导通的状态&#xff…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...