线程同步工具之CountDownLatch示例

一文搞懂 RC Correlation Scale Factor 的生成与应用 pre-route 用的是统计估算模型,post-route 用的是详细布线提取,signoff 用的是第三方 QRC 或 StarRC——三个工具,三套参数体系,结果自然天差地别。不同 RC corner(rc_worst/rc_best/rc_typical)对应不同的工艺角和温度环境,每个 corner 的 R/C 偏差比例不同,必须分别生成和应用各自的 scale factor。别被名字骗了,这个工具专门干一件事——统计拟合两组 SPEF 之间的偏差,自动推荐最优 scaling factor。 阅读详情

CountDownLatch的一个非常典型的应用场景是:有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行。假如我们这个想要继续往下执行的任务调用一个CountDownLatch对象的await()方法,其他的任务执行完自己的任务后调用同一个CountDownLatch对象上的countDown()方法,这个调用await()方法的任务将一直阻塞等待,直到这个CountDownLatch对象的计数值减到0为止。

  1. package chapter3;  
  2.   
  3. import java.util.concurrent.CountDownLatch;  
  4.   
  5. public class Videoconference implements Runnable{  
  6.   
  7.     private final CountDownLatch controller;  
  8.     public Videoconference(int number){  
  9.         controller = new CountDownLatch(number);  
  10.     }  
  11.       
  12.     public void arrive(String name){  
  13.         System.out.println(name+” has arrived.”);  
  14.         controller.countDown();  
  15.         System.out.println(”VideoConference:Waiting for ”+controller.getCount());  
  16.     }  
  17.       
  18.     @Override  
  19.     public void run() {  
  20.   
  21.         System.out.println(”VideoConference:Initialization:”+controller.getCount());  
  22.           
  23.         try {  
  24.             controller.await();  
  25.             System.out.printf(”VideoConference: All the participants have come\n”);  
  26.             System.out.printf(”VideoConference: Let’s start…\n”);  
  27.   
  28.         } catch (InterruptedException e) {  
  29.             e.printStackTrace();  
  30.         }  
  31.     }  
  32. }  
package chapter3;

import java.util.concurrent.CountDownLatch;

public class Videoconference implements Runnable{

    private final CountDownLatch controller;
    public Videoconference(int number){
        controller = new CountDownLatch(number);
    }

    public void arrive(String name){
        System.out.println(name+" has arrived.");
        controller.countDown();
        System.out.println("VideoConference:Waiting for "+controller.getCount());
    }

    @Override
    public void run() {

        System.out.println("VideoConference:Initialization:"+controller.getCount());

        try {
            controller.await();
            System.out.printf("VideoConference: All the participants have come\n");
            System.out.printf("VideoConference: Let's start...\n");

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

  1. package chapter3;  
  2.   
  3. import java.util.concurrent.TimeUnit;  
  4.   
  5. public class Participant implements Runnable{  
  6.     private Videoconference conference;  
  7.     private String name;  
  8.       
  9.     public Participant(Videoconference conference,String name){  
  10.         this.conference = conference;  
  11.         this.name = name;  
  12.           
  13.           
  14.     }  
  15.       
  16.     @Override  
  17.     public void run() {  
  18.   
  19.         long duration = (long)(Math.random()*10);  
  20.         try {  
  21.             TimeUnit.SECONDS.sleep(duration);  
  22.         } catch (InterruptedException e) {  
  23.             // TODO Auto-generated catch block  
  24.             e.printStackTrace();  
  25.         }  
  26.         conference.arrive(name);  
  27.     }  
  28.   
  29. }  
package chapter3;

import java.util.concurrent.TimeUnit;

public class Participant implements Runnable{
    private Videoconference conference;
    private String name;

    public Participant(Videoconference conference,String name){
        this.conference = conference;
        this.name = name;


    }

    @Override
    public void run() {

        long duration = (long)(Math.random()*10);
        try {
            TimeUnit.SECONDS.sleep(duration);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        conference.arrive(name);
    }

}

  1. package chapter3;  
  2. /** 
  3.  *  
  4.  * <p> 
  5.  * Description: CountDownLatch的学习 
  6.  * </p> 
  7.  * @author zhangjunshuai 
  8.  * @version 1.0 
  9.  * Create Date: 2014-9-25 下午8:11:55 
  10.  * Project Name: Java7Thread 
  11.  * 
  12.  * <pre> 
  13.  * Modification History:  
  14.   *             Date                                Author                   Version          Description  
  15.  * ———————————————————————————————————–   
  16.  * LastChange: Date::&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;      Author:&nbsp;          Rev:&nbsp;          
  17.  * </pre> 
  18.  * 
  19.  */  
  20. public class Main2 {  
  21.   
  22.     /** 
  23.      * <p> 
  24.      * </p> 
  25.      * @author zhangjunshuai 
  26.      * @date 2014-9-25 下午8:11:50 
  27.      * @param args 
  28.      */  
  29.     public static void main(String[] args) {  
  30.         Videoconference conference = new Videoconference(9);  
  31.         Thread threadConference = new Thread(conference);  
  32.         threadConference.start();  
  33.         for(int i=0;i<10;i++){  
  34.             Participant p = new Participant(conference, “Participant”+i);  
  35.             Thread t = new Thread(p);  
  36.             t.start();  
  37.         }  
  38.     }  
  39.   
  40. }  
package chapter3;
/**
 * 
 * <p>
 * Description: CountDownLatch的学习
 * </p>
 * @author zhangjunshuai
 * @version 1.0
 * Create Date: 2014-9-25 下午8:11:55
 * Project Name: Java7Thread
 *
 * <pre>
 * Modification History: 
  *             Date                                Author                   Version          Description 
 * -----------------------------------------------------------------------------------------------------------  
 * LastChange: $Date::             $      $Author: $          $Rev: $         
 * </pre>
 *
 */
public class Main2 {

    /**
     * <p>
     * </p>
     * @author zhangjunshuai
     * @date 2014-9-25 下午8:11:50
     * @param args
     */
    public static void main(String[] args) {
        Videoconference conference = new Videoconference(9);
        Thread threadConference = new Thread(conference);
        threadConference.start();
        for(int i=0;i<10;i++){
            Participant p = new Participant(conference, "Participant"+i);
            Thread t = new Thread(p);
            t.start();
        }
    }

}

CountDownLatch类有3个基本元素:

  1. 初始值决定CountDownLatch类需要等待的事件的数量。
  2. await() 方法, 被等待全部事件终结的线程调用。
  3. countDown() 方法,事件在结束执行后调用。

当创建 CountDownLatch 对象时,对象使用构造函数的参数来初始化内部计数器。每次调用 countDown() 方法, CountDownLatch 对象内部计数器减一。当内部计数器达到0时, CountDownLatch 对象唤醒全部使用 await() 方法睡眠的线程们。

不可能重新初始化或者修改CountDownLatch对象的内部计数器的值。一旦计数器的值初始后,唯一可以修改它的方法就是之前用的 countDown() 方法。当计数器到达0时, 全部调用 await() 方法会立刻返回,接下来任何countDown() 方法的调用都将不会造成任何影响。

此方法与其他同步方法有这些不同:

CountDownLatch 机制不是用来保护共享资源或者临界区。它是用来同步一个或者多个执行多个任务的线程。它只能使用一次。像之前解说的,一旦CountDownLatch的计数器到达0,任何对它的方法的调用都是无效的。如果你想再次同步,你必须创建新的对象。

CountDownLatch 类有另一种版本的 await() 方法,它是:

  • await(long time, TimeUnit unit): 此方法会休眠直到被中断; CountDownLatch 内部计数器到达0或者特定的时间过去了。TimeUnit 类包含了:DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS, 和 SECONDS.

AUTOSAR系统服务篇 - BswM的使用 本文档是对4.0.3版及更高版本的AUTOSAR模式管理应用的介绍。其主要目的是为AUTOSAR的用户和开发人员提供基于示例的AUTOSAR模式管理不同方面的详细概述,这些示例在文中进行了解释。本文中的代码清单共同构成了示例ECU的配置。第2章解释了基础的模式管理概念,例如一般的模式、如何实现模式切换、模式管理者和模式用户的角色等。其次介绍了应用模式管理和基础软件模式管理的依赖关系,两者密切相关。基础软件模式管理器是AUTOSAR R4.0中的中央模式管理模块。它具有很高的可配置性。 阅读详情

相关推荐

【项目实战】小智AI MCP协议在IoT设备控制中的深度应用解析

本文深度解析小智AI MCP协议在IoT设备控制中的应用实践。通过MCP协议作为AI与物联网设备的翻译桥梁,实现大语言模型与ESP32等硬件的无缝通信。文章详细介绍了环境搭建、工具注册、消息路由机制,并以语音控制RGB灯光系统为例展示完整开发流程,为AIoT开发者提供实用指南。

oauth7security的博客 826

CountdownLatch详解

文章转载自:https://segmentfault.com/a/1190000016508108 CountdownLatch CountDownLatch本身是基于共享锁实现的,该工具是为了解决某些操作只能在一组操作全部执行完成后才能执行的情景CountDown是倒数计数,所以CountDownLatch的用法通常是设定一个大于0的值,该值即代表需要等待的总任务数,每完成一个任务后,将总任...

清风不灭的博客 1万+

开发者的避坑指南:在Apple Silicon Mac上构建RocketMQ Python客户端的完整心路历程

本文详细记录了在Apple Silicon Mac上构建RocketMQ Python客户端的完整过程,重点解决了架构兼容性问题。通过源码编译rocketmq-client-cpp库,修复构建脚本和CMake配置,最终成功在M2芯片MacBook Pro上部署RocketMQ Python客户端,为开发者提供了实用的避坑指南。

Pepper的专栏 696

latch.await java有什么作用_java使用CountDownLatch等待多线程全部执行完成

前言CountDownLatch 允许一个或多个线程等待其他线程完成操作。应用场景假如有一个列表的大量数据等待处理,最后全部处理完毕后返回处理结果。普通做法就是从头遍历,一个个顺序执行,这样单线程处理效率不高,我们希望使用多线程的方式处理,同时在主线程等待所有子线程处理完成。CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待N个点完成,这里就传入N。当我们调用一...

weixin_39980002的博客 1154

Spring Boot 3.5.4 + LangChain4j实战:用Milvus搭建企业级RAG问答系统(附阿里百炼API配置)

本文详细介绍了如何利用Spring Boot 3.5.4、LangChain4j与Milvus构建企业级RAG问答系统。内容涵盖从架构设计、阿里百炼API安全配置、Milvus部署优化,到RAG检索、会话管理等核心实现,并提供了生产级API设计、监控集成及性能优化等实战经验,旨在帮助开发者打造高可用、可维护的Java AI应用。

weixin_29054399的博客 610

【雷达】基于matlab合成孔径雷达干涉测量(InSAR)时序分析【含Matlab源码 9037期】

合成孔径雷达干涉测量(InSAR)时序分析 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 159

java countdownlatch_并发工具类(一)等待多线程完成的CountDownLatch

简介CountDownLatch 允许一个或多个线程等待其他线程完成操作。应用场景假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。在这个需求中,要实现主线程等待所有线程完成sheet的解析操作,最简单的做法是使用join。代码如下:public class Jo...

weixin_35867994的博客 281

【OTFS与信号处理:论文阅读4】OTFS时延多普勒域嵌入导频辅助信道估计(已更新)

【OTFS与信号处理:论文阅读】Embedded Pilot-Aided Channel Estimation for OTFS in Delay–Doppler Channel(快来看看OTFS嵌入式导频设计的经典之作!!!)

Cuby的博客 5338

latch.await java有什么作用_CountDownLatch源码解析之await()

CountDownLatch 源码解析—— await(),具体内容如下上一篇文章说了一下CountDownLatch的使用方法。这篇文章就从源码层面说一下await() 的原理。我们已经知道await 能够让当前线程处于阻塞状态,直到锁存器计数为零(或者线程中断)。下面是它的源码。end.await();↓public void await() throws InterruptedExcepti...

weixin_34966346的博客 2231

ENS160传感器原理图设计,已量产(空气质量传感器)

ENS160 是一款集成式数字空气质量传感器,核心优势源于 “MEMS 传感元件 + 内置微处理器” 的架构。

不脱发的程序猿 575

CST与MATLAB连接设置

打开MATLAB,点击"Set Path"按钮,然后点击"Add Folder"。在CST中,点击"Options"菜单,然后选择"Advanced"选项。在弹出的对话框中,点击"COMSOL"选项卡,并确保"Enable COMSOL"复选框被选中。通过上述步骤和示例代码,你可以开始使用MATLAB与CST进行集成,并根据你的具体需求进行进一步的开发和应用。通过这个简单的示例,你可以开始在MATLAB中与CST进行交互,并根据你的需求进行更复杂的操作,如参数化仿真、优化和数据处理等。

TechPulseZ的博客 1966

深入理解并发工具类CountDownLatch

本篇文章想要讲解 JUC 工具类 CountDownLatch,因为 CountDownLatch 提供了简单有效的线程协调和控制机制,所以实际开发中是比较常用的,所以有必要了解一下 CountDownLatch。CountDownLatch 作为 Java 中的一个同步工具类,用于在多线程间实现协调和控制,允许一个或多个线程等待其他线程完成操作后再继续执行。CountDownLatch 内部维护了一个计数器,可以通过构造函数指定初始计数值。

weixin_64403990的博客 373

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

CountDownLatch 作用理解示例

CountDownLatch 是Java1.5之后引入的Java并发工具类,在java.util.concurrent包下。 CountDownLatch 是个计数器锁,用于阻塞当前线程,等待其他前程都执行完毕 再继续执行。初始化是需要传入一个int类型的整数:CountDownLatch countDown = new CountDownLatch(5) 表示初始计数器的值表示 线程数。 作...

莫道青天真无道,能逍遥时且逍遥! 1674

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java 多线程之 CountDownLatch(计数等待/同步辅助类)

CountDownLatch 是Java中提供的一种同步工具类,用于控制多个线程之间的执行顺序和协调。CountDownLatch 通过一个计数器来实现,该计数器初始化为一个正整数,表示需要等待的线程数目。每个线程执行完一定的任务后,会调用方法将计数器减1。当计数器减到0时,表示所有线程已经完成任务,等待在await()方法处的线程被唤醒,继续执行后续操作。控制执行顺序:控制多个线程执行的顺序,让某个线程等待其他线程完成特定任务后再执行。

QIFU的专栏 2115

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

java线程之间的同步CountDownLatch

当一个子任务完成时,就调用countDown方法,这个方法会将计数器的值减1。其他线程可以调用await方法,这个线程就会阻塞等待,直到计数器的值变为0。例如,假设有一个主线程需要等待10个工作线程全部完成任务后再汇总结果,就可以用CountDownLatch,初始值设为10,每个工作线程完成任务后调用countDown,主线程调用await等待所有工作线程完成。方法等待所有工作线程完成任务,当所有工作线程完成任务后,主线程才会继续执行打印语句。:在每个需要同步的线程任务里,当任务完成后调用。

言之。 1万+

高级同步机制:Phaser与CountDownLatch详解

和Phaser都是Java并发编程中非常有用的同步工具。适用于简单的等待-完成场景,而Phaser提供了更灵活的多阶段同步机制。通过合理使用这些工具,我们可以有效地管理多线程环境下的同步问题,提高程序的性能和可靠性。希望这些示例和解释能帮助新人更好地理解和应用这些高级同步机制。

weixin_53840353的博客 957

CountDownLatch原理以及使用案例

CountDownLatch介绍 CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行。 CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它们都存在于java.util.concurrent包下 CountDownLatch 定义了一个计数器,和一个阻塞队列, 当计数器的值递减为0之前,阻塞队列里面的线程

wr_java的博客 471

CountDownLatch详解

CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,用来作为线程间的通信而不是互斥作用。CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现,计数器初始值就是线程的数量。当每个被计数的线程完成任务后,计数器值减一,当计数器的值为0时,表示所有线程都已经完成了任务,然后在CountDownLatch上等待的线程就可以恢复执行。CountDownLatch初始化一个全局计数器;

n0430的博客 665

CountDownLatch与CyclicBarrier使用及区别

是 Java 并发编程中的一个同步工具类,用于让一个或多个线程等待其他线程完成操作后再继续执行。它的核心思想是通过一个计数器来实现线程的等待和唤醒。是 Java 并发编程中的一个同步工具类,用于让一组线程相互等待,直到所有线程都到达某个屏障点(Barrier Point)后再继续执行。

qq_45626589的博客 963

java thread signal_java — Thread之CountDownLatch的使用

CountDownLatch的简单使用CountDownLatch的简单介绍:CountDownLatch类是一个同步计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0 时,await()方法会阻塞程序继续执行CountDownLatch是一个倒计数的锁存器,当计数减至0时触发特定的事件。CountDownLatch被用来同步一个...

weixin_34083807的博客 175

CountDownLatch 详细介绍

CountDownLatch 是一个简单而强大的同步工具,适用于协调多线程任务的完成顺序或统一启动。

技术分享 1145

Java 入门指南:Java 并发编程 —— 同步工具类 CountDownLatch(倒计时门闩)

CountDownLatch(倒计时门闩)是 Java 中的一种同步辅助类,用于控制多个线程之间的协调,允许一个或多个线程等待其他线程完成一组操作。 CountDownLatch 通过维护一个计数器来实现,计数器初始值可以设定为一个正整数(通常为需要等待的线程数量或任务数量)。每当一个线程完成任务后,计数器的值就会减1。当计数器的值减到 0 时,所有等待的线程都会被释放,此时所有因调用 await() 方法而阻塞的线程都会被唤醒,继续执行后续的操作。

热带鱼的技术博客 1706

CyclicBarrier VS CountDownLatch比较

CyclicBarrier VS CountDownLatch比较

weixin_45428910的博客 373

Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例 (r)

概要 前面对"独占锁"和"共享锁"有了个大致的了解;本章,我们对CountDownLatch进行学习。和ReadWriteLock.ReadLock一样,CountDownLatch的本质也是一个"共享锁"。本章的内容包括: CountDownLatch简介 CountDownLatch数据结构 CountDownLatch源码分析(基于JDK1.7.0_40) CountDownL

XINJing的专栏 792

CountDownLatch详解以及用法示例

CountDownLatch是一个同步工具类,它通过一个计数器来实现的,初始值为线程的数量。每当一个线程完成了自己的任务,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已执行完毕,然后在等待的线程就可以恢复执行任务。

木牛的博客 1617

CountDownLatch 和 CyclicBarrier 的内部原理和用法?

CountDownLatch 和 CyclicBarrier 的内部原理和用法?

码出财富,敲出大千世界 918
上一篇: java编程思想笔记---并发优先级
下一篇: java编程思想笔记-并发之后台线程
光与热
博客等级 码龄11年 55粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值