CountDownLatch, CyclicBarrier和Semaphore

无人机开发平台全解析:从开源飞控到企业级应用实战指南 无人机开发平台是无人机从飞行器演变为智能空中机器人的核心,其本质是提供了一套标准化的软硬件接口与工具链,使开发者能够基于稳定可靠的底层系统,专注于上层应用创新。从技术原理上看,一个完整的开发平台通常包含飞行控制器、机载计算机、传感器套件等硬件层,以及飞控固件、机器人操作系统(ROS/ROS 2)、软件开发套件(SDK)等软件层,通过分层架构实现飞行控制、感知决策与任务执行的解耦。其技术价值在于大幅降低了无人机行业应用的开发门槛,使开发者无需从零构建飞行控制系统,即可快速实现自动巡检、精准农业、物流配送等复杂 阅读详情

CountDownLatch

描述:
一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
API简述

// 构造器, 指定计数值的初始值
public CountDownLatch(int count)
// 使当前线程等待, 除非当前计数为0
public void await()
// 线程等待, 添加了个超时时间,如果超过了 设置的时间 及时计数不为0也继续执行
public boolean await(long timeout, TimeUnit unit)
// 计数减一
 public void countDown()

应用

  // 创建一个默认计数为1 的countDownLatch
        final CountDownLatch countDownLatch = new CountDownLatch(1);

        new Thread(() -> {
            try {
                // 线程等待 countDownLatch计数为0
                countDownLatch.await();
            System.out.println(Thread.currentThread().getName() + " 在执行   countDownLatch.await();");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        new Thread(() -> {
            try {
            System.out.println(Thread.currentThread().getName() + " 在执行   countDownLatch.countDown();");
                TimeUnit.SECONDS.sleep(1);
                // 计数减一
                countDownLatch.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

CyclicBarrier

和CountDownLatch 作用类似,不过他可以循环使用,相当于一个阀门,如果等待的线程数到达这个阈值则放行所有等待的线程, 然后从新计算
官方解释:允许一组线程全部等待彼此达到共同屏障点的同步辅助
countdownLatch是计数为0 后放行所有等待的线程,CyclicBarrier是等待的线程数到达指定的值后放行所有等待的线程
API

// 构造器, parties 线程等待数阈值
 public CyclicBarrier(int parties)
 // 构造器,parties 线程等待数阈值, barrierAction 当屏障数到达阈值后执行的回调函数
public CyclicBarrier(int parties, Runnable barrierAction)
// await() 线程等待
 public int await() throws InterruptedException, BrokenBarrierException 
 // 带有等待超时时间的await
  public int await(long timeout, TimeUnit unit)
// 重置阈值从新计算, 如果有线程在等待则抛异常java.util.concurrent.BrokenBarrierException
public void reset()

应用

// 当等待的线程数到达设置的阈值的时候,执行回调函数,然后等待的线程继续执行
     final CyclicBarrier cyclicBarrier = new CyclicBarrier(2,
                new Thread(()-> {
                    System.out.println("执行回调函数。。。");
                }));
        new Thread(() -> {
            try {
            // 线程第一次等待
                cyclicBarrier.await();
            System.out.println(Thread.currentThread().getName() +" 开始执行1");
            // 线程第二次等待
                cyclicBarrier.await();
            System.out.println(Thread.currentThread().getName() +" 开始执行2");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }).start();
        new Thread(() -> {
            try {
                cyclicBarrier.await();
                System.out.println(Thread.currentThread().getName() +" 开始执行1!");
                cyclicBarrier.await();
                System.out.println(Thread.currentThread().getName() +" 开始执行2!");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }).start();

输出结果

执行回调函数。。。
Thread-2 开始执行1!
Thread-1 开始执行1
执行回调函数。。。
Thread-1 开始执行2
Thread-2 开始执行2!

Semaphore

字面意思就是信号量,可以控制并发访问的线程数;Semaphore可以用于做流量控制

API

// 创建一个指定数量许可的Semaphore
public Semaphore(int permits)
// fair 是否公平
public Semaphore(int permits, boolean fair)
// 获取一个许可, 如果获取不到则阻塞
public void acquire() throws InterruptedException 
// 尝试获取一个许可,获取到返回true, 获取不到返回false
public boolean tryAcquire() 
// 在指定时间内尝试获取一个许可
public boolean tryAcquire(long timeout, TimeUnit unit)
// 释放一个许可
public void release() 
//释放多个许可
public void release(int permits)

//返回此信号量中可用的许可证的当前数量。
public int availablePermits() 

//获取并返回所有可用的许可, 此方法会消耗掉所有的可用许可
public int drainPermits()
 

运用

        // 创建一个有两个许可证的Semaphore
        final Semaphore semaphore = new Semaphore(2);
        System.out.println("默认有" + semaphore.availablePermits() + " 个许可");
        // 创建10 个线程执行
        for (int i = 0; i <10 ; i++) {
            new Thread(() -> {
                try {
                    // 获取一个许可
                    Stopwatch stopwatch = Stopwatch.createStarted();
                    semaphore.acquire();
                    TimeUnit.SECONDS.sleep(1);
                    System.out.println(stopwatch.elapsed(TimeUnit.SECONDS) +" == " + Thread.currentThread().getName());

                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    // 释放一个许可
                    semaphore.release();
                }
            }).start();
        }

输出结果, 每秒只有2个线程在执行

默认有2 个许可
1 == Thread-1
1 == Thread-9
2 == Thread-8
2 == Thread-5
3 == Thread-0
3 == Thread-6
4 == Thread-3
4 == Thread-2
5 == Thread-7
5 == Thread-4

FPGA控制AD5754实现模数转换Verilog代码与测试激励 本文提供了使用FPGA控制AD5754芯片实现数字信号转模拟信号的Verilog代码和测试激励。AD5754芯片简介:AD5754是一款16位数字信号转模拟信号的芯片。通信方式:FPGA与AD5754之间通过SPI接口进行通信,SPI时钟clk的最大频率为30MHz。模拟输出:AD5754提供了四路模拟输出。工作方式:当前AD5754采用单极性工作方式。指令刷新:根据现有理解,同轴的速度和电流指令应同时刷新。利用LDAC引脚控制模拟信号的刷新,但需实际验证。CLR信号验证。 阅读详情

相关推荐

算法笔记 经典取石子游戏总结 博弈论

经典取石子游戏总结 1.巴什博弈 有一堆石子共n个,A和B轮流取,A先取。每次最少取1个,最多取m个,先取完者获胜(即没有石子取的人失败)。A与B都足够聪明,问A能否获胜。 结论:当n%(m+1)!=0时A必胜,否则必败。 2.斐波那契博弈 有一堆石子共n个,A和B轮流取,A先取。每次最少取1个。第一次不能取完。从第二次开始,每个人取的石子数至少为1,至多为前一个人取的石子数的2倍。先取完者获胜。...

CraigMC的博客 2934

Java并发编程第9讲——CountDownLatch、CyclicBarrier和Semaphore(万字详解)

在JDK的并发包(JUC)里提供了几个非常有用的并发工具类。CountDownLatch、CyclicBarrier和Samaphore工具类提供了一种并发流程控制的手段,这同样也是面试和工作中的一个重要知识点,本文将从它们的定义、常用方法、代码示例及核心源码的分析等几个要点详细介绍一下。

让~学习~成为一种习惯(橡 皮 人の技术博客) 2877

反激开关电源变压器设计实战:从理论到绕制的完整流程解析

本文详细解析了反激开关电源变压器的完整设计流程,从核心理论到实战绕制。文章以24W电源为例,手把手讲解如何根据输入输出电压、功率和频率等关键参数,计算匝比、峰值电流、电感量,并完成磁芯选择、匝数确定、气隙计算及线径选取。重点阐述了CCM模式下的设计要点与绕制工艺,旨在帮助工程师设计出稳定高效的反激变压器,避免常见陷阱。

weixin_29305313的博客 678

CountDownLatch、CyclicBarrier、Semaphore详解

CountDownLatch CountDownLatch概念 CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。 CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表...

方亚军的博客 1887

Maven的下载安装配置教程(详细图文)

目录 一、简单了解一下什么是Maven 二、maven的下载 三、maven的安装 四、maven的环境变量配置 五、setting文件配置 六、开发工具配置Maven 一、简单了解一下什么是Maven Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。 1.Maven翻译为“专家“, ”内行”的意思,是著名Apache公司下基于Java开发的开源项目。 2.Maven项目对象模型(POM)是一..

bakelFF的博客 12万+

深入解析AndroidManifest.xml与device_admin.xml:打造完美DeviceOwner应用配置

本文深入解析了Android企业级开发中DeviceOwner应用的核心配置文件AndroidManifest.xml与device_admin.xml。详细阐述了如何精准声明DeviceAdminReceiver、定义管理策略,并提供了通过ADB命令进行设置与验证的实战指南,帮助开发者构建权限完整、配置正确的设备所有者应用。

ice55的博客 679

简述CyclicBarrier、CountDownLatch和Semaphore

文章目录前言一. 概念篇1.1 CyclicBarrier1.2. CountDownLatch1.3. Semaphore二. 案例篇2.1. CyclicBarrier2.2. CountDownLatch2.3. Semaphore三. 深入篇3.1. CyclicBarrier3.2. CountDownLatch3.3. Semaphore3.4. CAS3.5. AQS 前言

米二的博客 3759

[ENVI]-[高光谱遥感]-波谱沙漏分析工具的使用

图1-2-1查看特殊波段的坏波段图1-2-2在中添加坏波段ENVI波谱沙漏分析工具MNF变换。

m0_57992372的博客 1467

多线程(九)并发工具

CountDownLatch、CyclicBarrier、Semaphore、Exchanger、Phaser

HK的博客 2438

保姆级避坑指南:在NVMe SSD上安装Ubuntu 24.04,搞定RST错误和分区方案

本文提供在NVMe SSD上安装Ubuntu 24.04的详细指南,解决RST错误和分区方案问题。从BIOS设置到分区策略优化,帮助用户充分发挥NVMe固态硬盘性能,避免常见安装陷阱,实现无痛安装和后期调优。

weixin_26976635的博客 560

YOLOv8自定义训练:车牌识别全流程(从标注到推理,附可视化代码)

车牌检测全流程实践指南 摘要:本文详细介绍了基于YOLOv8的车牌检测完整实现方案。针对车牌检测中的三大难点(小目标、多角度、光照变化),提供了从数据准备到模型部署的全流程解决方案。重点包括:1)数据采集与标注规范;2)针对小目标的YOLOv8模型优化配置;3)K-means锚框聚类方法;4)训练参数调优策略。通过实际验证,该方法可获得95%以上的检测准确率,并附有完整的代码实现和可视化工具,便于开发者快速复现应用。 (字数:149字)

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 849

CountDownLatch、CyclicBarrier和Semaphore

 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。   以下是本文目录大纲:   一.CountDownLatch用法   二.CyclicBarrier用法   三.Semaphore用法 一.CountDownLatch用法   CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一

FYHannnnnn的博客 377

ardupilot BMI088加速度陀螺仪学习

本节主要记录ardupilot 中BMI088传感器的学习过程,欢迎批评指正。BMI088是一款高性能6轴惯性传感器,由16位数字三轴±24g加速度计和16位数字三轴±2000°/ s陀螺仪组成。 BMI088允许高精度测量方向和沿三个正交轴的运动检测。BMI088具有高振动鲁棒性和3 x 4.5 x0.95mm³的小尺寸,是用于无人机和机器人应用等恶劣环境的高性能IMU中的独特产品。 BMI088专门设计用于有效抑制由于PCB上的共振或整个系统的结构而可能发生的振动。 除了高振动稳定性外,BMI088的出

陌城烟雨 2052

CountDownLatch、CyclicBarrier 和 Semaphore

主要介绍了Java并发编程中三个重要的同步工具:CountDownLatch、CyclicBarrier和Semaphore,它们的原理,使用场景...

程序员Forlan的博客 1803

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【Java并发】辅助类CountDownLatch、CyclicBarrier、Semaphore

本文总结了JUC常用三大辅助类CountDownLatch、CyclicBarrier、Semaphore的使用方法(含示例代码和方法解析)。

hrh的博客 3224

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

CountDownLatch、CyclicBarrier、semaphore

CountDownLatch中调用await方法线程需要等待所有调用countDown方法的线程执行,这就很适合一个业务需要一些准备条件,等准备条件准备好之后再继续执行,如果一些复杂的聚合查询,还有一些类似于广播消息的功能。

星坠竹空 1581

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深入解析 CountDownLatch、Semaphore 和CyclicBarrier

特性Semaphore核心目标等待一组操作完成控制资源并发访问多线程协同到达屏障点重用性否(一次性)是(许可可释放)是(自动或手动重置)底层实现AQS 共享锁AQS 共享锁适用场景主从协作(一等多)资源池化/限流(多对多)多线程分阶段协作(多对多)异常处理无特殊异常需处理 InterruptedException需处理 BrokenBarrierException性能影响低(仅计数器操作)中等(CAS 竞争)高(锁竞争 + 条件变量)

fjkxyl的博客 1075

CountDownLatch、Semaphore、CyclicBarrier

同步一批线程的行为 CountDownLatch、Semaphore、CyclicBarrier

一张小羊毛的博客 3345

CountDownLatch、CyclicBarrier与Semaphore 核心技术解析

文章深入分析了CountDownLatch、CyclicBarrier和Semaphore三大并发工具的核心实现。CountDownLatch基于AQS共享模式实现一次性计数器同步,通过state字段存储计数值,在计数归零时唤醒所有等待线程。CyclicBarrier采用ReentrantLock+Condition实现可重复使用的栅栏同步,支持周期性重置。Semaphore同样基于AQS,通过state管理许可证数量,提供公平与非公平两种获取策略。

lifallen的博客 1174

[沧海拾遗]java并发之CountDownLatch、Semaphore和CyclicBarrier

JAVA并发包中有三个类用于同步一批线程的行为,分别是CountDownLatch、Semaphore和CyclicBarrier。 CountDownLatch CountDownLatch是一个计数器闭锁,主要的功能就是通过await()方法来阻塞住当前线程,然后等待计数器减少到0了,再唤起这些线程继续执行。 这个类里主要有两个方法,一个是向下减计数器的方法:countdown()

yanhandle的专栏 1万+

CountDownLatch、CyclicBarrier、Semaphore、Exchanger详解

CountDownLatch CountDownLatch 允许一个或多个线程等待其他线程完成操作。 假如有这样一个需求:我们需要解析一个Excel里多个sheet的数据,此时可以考虑使用多 线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完 成。在这个需求中,要实现主线程等待所有线程完成sheet的解析操作,最简单的做法是使用 join()方法: public class JoinCountDownLatchTest { public static v

7me 6287

简析CountDownLatch、CyclicBarrier、Semaphore

一、CountDownLatch 1、定义 用来协调线程间的同步,起到线程之间的通信作用的工具类。 它能够使一个线程再等待一些线程完成各自工作后,再继续执行。使用一个计数器实现,计数器初始值为线程的数量,当每一个线程完成自己任务后,计数器的值会减1,当计数器的值为0时,表示所有的线程都完成了任务,然后CountDownLatch上等待的线程就可以恢复执行任务。 2、应用场景 某一个线程再开始运行前等待n个线程执行完毕,如启动一个服务时,主线程需要等待多个组件加载完毕,之后再执行...

heyi12345的专栏 544

CountDownLatch、CyclicBarrier和Semaphore用法与区别

在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。   以下是本文目录大纲:   一.CountDownLatch用法   二.CyclicBarrier用法   三.Semaphore用法    一.CountDownLatch用法   CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比

Coder 1518

CountDownLatch、CyclicBarrier、Semaphore

一、CountDownLatch 直接上代码看效果 /* * Copyright (C), 2013-2019, 天津大海云科技有限公司 */ import java.util.concurrent.CountDownLatch; /** * @author yangjikang * @date 2019/6/17 14:05 * @description CountDownLat...

weixin_39827145的博客 166

Semaphore、CountdownLatch、CyclicBarrier详解

文章目录1.Semaphore1.1 基本使用1.2 Semaphore原理-图解流程1.3 Semaphore原理-源码分析2.CountdownLatch3.CyclicBarrier 1.Semaphore 信号量,用来限制能同时访问共享资源的线程上限。 1.1 基本使用 /** * @ClassName SemaphoreTest * @author: shouanzh * @Description 信号量,用来限制能同时访问共享资源的线程上限。 * @date 2022/3/20 11:3

张大安的博客 1083

Semaphore、CountDownLatch、CyclicBarrier原理

对于AQS的原理和ReentrantLock原理不熟悉的小伙伴可以参考上篇文章(并发编程之AQS原理及其ReentrantLock原理),这篇文章我们再继续深入看下AQS 一、Semaphore底层实现(author:Doug Lea) //信号量 共享锁 Semaphore windows = new Semaphore(3); for(int i=0; i<5; i++) { Thread t = new Thread((

Zong__Zong的博客 307
上一篇: JAVA线程池
下一篇: atomic原子类
xiaoduup
博客等级 码龄9年 23粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值