二十七. 并发实战-CountDownLatch的使用 布满荆棘的人生 2024-03-27 08:49 20阅读 0赞 ### 前言 ### 关于`CountDownLatch`,官方注释中给出的说明如下。 > **一种同步辅助工具,允许一个或多个线程等待,直到在其它线程中执行的一组操作完成** 本篇文章,将对`CountDownLatch`的使用进行说明。 ### 正文 ### 演示示例如下所示。 public class CountDownLatchTest { private long[] nums; private int sum1 = 0; private int sum2 = 0; @Before public void setUp() throws Exception { nums = new long[200]; for (int i = 0; i < 200; i++) { nums[i] = i; } } @Test public void 主线程等待子线程执行完任务后再继续往下执行() throws Exception { // 创建线程池 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 4, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(300)); // 创建CountDownLatch对象,count值为2 CountDownLatch countDownLatch = new CountDownLatch(2); // 任务1计算nums数组的0-99索引的数字和 Runnable fistRunnable = new Runnable() { int count = 0; @Override public void run() { for (int i = 0; i < 100; i++) { count += nums[i]; } sum1 = count; countDownLatch.countDown(); } }; // 任务2计算nums数组的100-199索引的数字和 Runnable secondRunnable = new Runnable() { int count = 0; @Override public void run() { for (int i = 100; i < 199; i++) { count += nums[i]; } sum2 = count; countDownLatch.countDown(); } }; // 线程池执行任务 threadPoolExecutor.execute(fistRunnable); threadPoolExecutor.execute(secondRunnable); // 等待任务1和任务2执行完毕 countDownLatch.await(); // 打印结果 System.out.println("第一个任务的执行结果是:" + sum1); System.out.println("第二个任务的执行结果是:" + sum2); } } 主要的功能就是给定一个200长度的数组**nums**,然后让线程1计算数组索引0-99的累加和**sum1**,线程2计算数组索引100-199的累加和**sum2**,主线程中等待线程1和线程2计算完毕后,打印**sum1**和**sum2**的值。 运行测试程序,打印结果如下。 ![在这里插入图片描述][0247e4f0e5f349b9b8987f8affc31413.jpeg_pic_center] ### 总结 ### `CountDownLatch`的使用方式总结如下。 1. 创建`CountDownLatch`对象,创建时指定**count**数量,**count**数量表明`CountDownLatch`的`countDown()`方法被调用多少次,才唤醒在`CountDownLatch`的`await()`方法上阻塞的线程,通常,**count**值需要设置为大于0的整数值(设置为0也可以,但是没意义); 2. 需要等待其它线程执行完任务的线程需要调用`CountDownLatch`的`await()`方法,以实现阻塞等待; 3. 执行任务的线程执行完任务后,需要调用`CountDownLatch`的`countDown()`方法来减少**count**值; 4. 当**count**值减少到0时,唤醒所有在`CountDownLatch`的`await()`方法上等待的线程。 [0247e4f0e5f349b9b8987f8affc31413.jpeg_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/27/a86c1e98fe0d4aa0b7d2c6407009f664.png
相关 Java并发编程实战:CountDownLatch案例 CountDownLatch是Java并发工具箱中的一个类,它主要用于协调多个线程的执行。 下面是一个简单的CountDownLatch案例: ```java import 客官°小女子只卖身不卖艺/ 2024年09月10日 02:54/ 0 赞/ 25 阅读
相关 二十四. 并发实战-ReentrantLock使用 前言 本篇文章将对`JUC`并发包里提供的`ReentrantLock`的使用进行说明。 正文 一. 非公平锁的使用 `ReentrantLock`默认是非 冷不防/ 2024年03月30日 17:58/ 0 赞/ 26 阅读
相关 二十三. 并发实战-ScheduledThreadPoolExecutor使用 前言 本篇文章将对计划线程池`ScheduledThreadPoolExecutor`的使用进行说明。 正文 一. 延时执行有返回值的任务 延时执行的意思就 淩亂°似流年/ 2024年03月30日 17:46/ 0 赞/ 23 阅读
相关 二十二. 并发实战-ThreadPoolExecutor使用 前言 本篇文章将对线程池`ThreadPoolExecutor`的使用进行说明。 正文 一. 执行无返回值任务 通过`ThreadPoolExecutor` - 日理万妓/ 2024年03月29日 16:20/ 0 赞/ 35 阅读
相关 二十七. 并发实战-CountDownLatch的使用 前言 关于`CountDownLatch`,官方注释中给出的说明如下。 > 一种同步辅助工具,允许一个或多个线程等待,直到在其它线程中执行的一组操作完成 本篇文章,将 布满荆棘的人生/ 2024年03月27日 08:49/ 0 赞/ 21 阅读
相关 二十六. 并发实战-读写锁的使用 前言 `JUC`并发包中提供了`ReentrantReadWriteLock`作为读写锁,本篇文章将对读写锁的如下四个场景进行演示。 1. 当前线程获取`读锁`时,` 曾经终败给现在/ 2024年03月27日 08:48/ 0 赞/ 27 阅读
相关 并发编程实战:CountDownLatch和CyclicBarrier的使用(实战应用) 模拟一群朋友相约聚餐,大家都到了就开始吃饭,大家都吃完饭了就去结账,并且约定谁最后到达饭店,谁就买单。 代码如下: package com.jinke.deli 电玩女神/ 2023年02月24日 03:54/ 0 赞/ 6 阅读
相关 Java并发学习之十七——线程同步工具之CountDownLatch 本文是学习网络上的文章时的总结,感谢大家无私的分享。 CountDownLatch的一个非常典型的应用场景是:有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继 逃离我推掉我的手/ 2022年08月12日 14:29/ 0 赞/ 179 阅读
相关 《java并发编程实战》 第十二章 并发程序的测试 《java并发编程实战笔记》 第十二章 并发程序的测试 正确性测试 基本单元测试(基于信号量有界缓存BoundedBuffer例子) 淩亂°似流年/ 2022年04月23日 09:44/ 0 赞/ 237 阅读
还没有评论,来说两句吧...