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

JAVA中CountDownLatch使用方法

CountDownLatch简单使用

CountDownLatch是一个倒计时锁存器,用来实现线程之间的同步操作

1.创建一个runable实现类

public class Worker implements Runnable {
    private List<String> outputScraper;
    private CountDownLatch countDownLatch;

    public Worker(List<String> outputScraper, CountDownLatch countDownLatch) {
        this.outputScraper = outputScraper;
        this.countDownLatch = countDownLatch;
    }

    @Override
    public void run() {
        doSomeWork();
        outputScraper.add("countDown");
        countDownLatch.countDown();
    }
}

2.创建测试类

@Test
public void test() throws InterruptedException {

    List<String> outputScraper = Collections.synchronizedList(new ArrayList<>());
    CountDownLatch countDownLatch = new CountDownLatch(5);
    List<Thread> workers = Stream
    .generate(() -> new Thread(new Worker(outputScraper, countDownLatch)))
    .limit(5)
    .collect(toList());

    workers.forEach(Thread::start);
    countDownLatch.await(); 
    outputScraper.add("latchReleased");

    assertThat(outputScraper).containsExactly("countDown","countDown","countDown","countDown","countDown","latchReleased");
}

此方法中创建了一个线程安全List和一个倒计时锁存器,锁存计数值为5,再创建5个线程执行Worker任务,传入的参数是同一个List和CountDownLatch,然后启动全部线程,在任务的run方法的最后调用countDownLatch.countDown()使计数器-1,在主线程中调用countDownLatch.await()等待计数器为0,然后再继续执行后面代码,保证了outputScraper.add(“latchReleased”)是在所有的outputScraper.add(“countDown”)之后才添加的。

异常处理

如果任务中途出现异常导致计数器锁存器不能正常-1,导致主线程一直等不到计数器为0,解决办法:

boolean completed = countDownLatch.await(3L, TimeUnit.SECONDS);

设置超时时间,如果规定时间内等待不到计数器清零则返回false。


http://www.kler.cn/a/401302.html

相关文章:

  • 柔性仿人手指全覆盖磁皮肤,具备接触觉和运动觉的双模态感知能力
  • 【C/C++】Lambda 用法
  • Spring 与 Spring MVC 与 Spring Boot三者之间的区别与联系
  • 贪心算法入门(三)
  • PostgreSQL高可用Patroni安装(超详细)
  • 学了Arcgis的水文分析——捕捉倾泻点,河流提取与河网分级,3D图层转要素失败的解决方法,测量学综合实习网站存着
  • 计算机毕业设计Python+大模型中医养生问答系统 知识图谱 医疗大数据 中医可视化 机器学习 深度学习 人工智能 大数据毕业设计
  • 【Python】爬虫实战:高效爬取电影网站信息指南(涵盖了诸多学习内容)
  • Flink vs Spark
  • 矢量拟合(2) - Vector Fitting算法原理
  • ROM修改进阶教程------安卓14去除修改系统应用后导致的卡logo验证步骤 适用安卓13 14 安卓15可借鉴参考
  • 视频号直播自动回复功能,浏览器自动化插件vx llike620
  • 使用FFmpeg实现视频与GIF的画中画效果
  • golang开发一个海盗王的登录更新器
  • 大模型投喂私有化的数据
  • 【JavaSE】【多线程】阻塞队列
  • Go语言中的错误嵌套
  • Elasticsearch面试内容整理-搜索与查询
  • 大数据-225 离线数仓 - 目前需求分析 指标口径 日志数据采集 taildir source HDFS Sink Agent Flume 优化配置
  • 【GNU】gcc -O编译选项 -Og -O0 -O1 -O2 -O3 -Os
  • 字符串地址解析 省市区
  • 20241119
  • 【Mac】未能完成该操作 Unable to locate a Java Runtime
  • HBase 基础操作
  • P1014 [NOIP1999 普及组] Cantor 表
  • 以Java为例,实现一个简单的命令行图书管理系统,包括添加图书、删除图书、查找图书等功能。