首页 > 编程语言 >使用Java线程同步工具类CountDownLatch

使用Java线程同步工具类CountDownLatch

时间:2023-07-16 23:23:18浏览次数:53  
标签:Java Thread 完毕 线程 结束 CountDownLatch new

java.util.concurrent.CountDownLatch是Java并发并发编程中的线程同步工具类,基于AQS(java.util.concurrent.locks.AbstractQueuedSynchronizer)实现。
CountDownLatch工具类主要应用在如下场景:等待一组线程执行完毕后继续执行后续操作。

应用举例:模拟使用多个线程同时调用多个RPC方法,然后汇总所有线程获取到的返回结果。

// 模拟同时调用多个接口获取数据,汇总后返回给客户端
private static void summary() throws InterruptedException {
    // 模拟需要调用10个方法才能获取到数据
    int count = 10;
    // 每个方法的返回结果都保存到列表中
    List<Object> result = new ArrayList<>(count);
    // 使用CountDownLatch来控制10个方法都执行完毕之后再汇总数据
    CountDownLatch latch = new CountDownLatch(count);
    for (int i = 0; i < count; i++) {
        int index = i;
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep((new Random().nextInt(10)) * 1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                result.add(String.format("result%s", index));
                // 每个线程在执行完毕之后都必须将计数器减1
                latch.countDown();
                System.out.println(String.format("线程%s结束了", Thread.currentThread().getName()));
            }
        }).start();
    }
    // 等待前面的所有方法都请求完毕并得到返回结果之后再进行处理
    System.out.println("等待所有方法执行完毕...");
    latch.await();

    // 从结果列表中获取返回信息
    System.out.println(String.format("最终的汇总结果:%s", result));
}

输出:

等待所有方法执行完毕...
线程Thread-9结束了
线程Thread-3结束了
线程Thread-6结束了
线程Thread-5结束了
线程Thread-7结束了
线程Thread-4结束了
线程Thread-0结束了
线程Thread-2结束了
线程Thread-8结束了
线程Thread-1结束了
最终的汇总结果:[result4, result0, result9, result8, result2, result5, result3, result6]

完毕!

标签:Java,Thread,完毕,线程,结束,CountDownLatch,new
From: https://www.cnblogs.com/nuccch/p/17558827.html

相关文章

  • 使用Java线程同步工具类CyclicBarrier
    如何使用java.util.concurrent.CyclicBarrier是Java并发并发编程中的线程同步工具类,基于java.util.concurrent.locks.ReentrantLock实现。CyclicBarrier工具类主要应用在如下场景:让一组线程同时到达栅栏位置才能开始执行。应用示例:publicstaticvoidmain(String[]args){......
  • javascript 快排
    functionquickSort(arr){//如果数组只有一个数,就直接返回;if(arr.length<1){returnarr;}//找到中间的那个数的索引值;如果是浮点......
  • 【技术积累】JavaScript中的基础语法【二】
    JavaScript编写方式JavaScript是一种脚本语言,用于为网页添加交互性和动态功能。它可以直接嵌入到HTML中,并通过浏览器解释执行。下面是一些常见的JavaScript编写方式和相应的代码示例:内联方式在HTML文件中直接嵌入JavaScript代码,使用`<script>`标签将代码包裹起来。这种方式适用......
  • Java数组
    Java数组数组的定义数组是相同类型数据的有序集合。数组描述的相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。数组声明创建首先必须声明数组变量,才能在程序中使用数组。下面是声明数组......
  • Java开发大型互联网-架构师必须掌握的分布式技术
    Java开发大型互联网-架构师必须掌握的分布式技术摘要:在当今互联网行业,随着用户量和业务的不断增长,大型互联网系统的设计和开发已经成为了一项头等重要的任务。作为架构师,要能够应对这样的挑战,就必须掌握一些关键的分布式技术。本文将介绍Java开发大型互联网系统时,架构师必须要掌......
  • 【线程池添加工作线程的流程】
    线程池添加工作线程:首先,线程池需要有一个存储工作线程的容器,比如可以使用一个List或者Queue。然后,使用一个变量来保存当前线程池中的线程数。在添加工作线程之前,需要进行两个判断。第一个判断是当前线程池中的线程数是否超过了最大线程数。如果超过了最大线程数,那么直接返......
  • Java项目12306售票系统
    Java项目12306售票系统 目录(一)系统功能概述3(二)系统功能模块结构31.前端功能32.WEB服务端43.数据库端4(三)系统界面设计51.登陆界面52.注册界面53.操作成功界面提示64.操作失败界面提示65.导航页76.购票页87.购买后打印电子车票页88.退票页与结果提示页89......
  • ThreadPoolTaskExecutor自定义线程池的配置和使用
    ThreadPoolTaskExecutor自定义线程池的配置和使用线程池ThreadPoolTaskExecutor和ThreadPoolExecutor的区别ThreadPoolExecutor,这个类是JDK中的线程池类,继承自Executor,里面有一个execute()方法,用来执行线程,线程池主要提供一个线程队列,队列中保存着所有等待状态的线程,避免了创......
  • 高级java高并发,高性能,分布式,高可用,负载均衡,系统架构实战
    提到锁,大家肯定想到的是sychronized关键字。是用它可以解决一切并发问题,但是,对于系统吞吐量要求更高的话,我们这提供几个小技巧。帮助大家减小锁颗粒度,提高并发能力。初级技巧-乐观锁乐观锁使用的场景是,读不会冲突,写会冲突。同时读的频率远大于写。悲观锁的实现: 悲观的认为所......
  • Java语言的特性
    面向对象:Java是一种纯面向对象的编程语言,这意味着Java中所有的代码都是以对象为基础的。在Java中,你可以通过定义类来创建对象,这些对象可以具有状态(属性)和行为(方法)。Java支持继承、多态和封装等面向对象的概念,使代码更加清晰、易于扩展和维护。平台无关性:Java的平台无关性......