CountDownLatch和 CyclicBarrier的使用

简介: CountDownLatch和 CyclicBarrier的使用

公众号merlinsea


  • CountDownLatch
  • CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。
  • countDownLatch.await()  state>0就会一直wait
  • countDownLatch.countDown()  state-1操作
public class CountDownLatchDemo {
    public static void main(String[] args) {
        /**
         * 传入的8会赋值给CountDowmLatch内部的Sync的state
         */
        CountDownLatch countDownLatch = new CountDownLatch(8);
        new Thread(()->{
            try {
                //只有等到CountDowmLatch内部的Sync的state==0才会被唤醒
                countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("800米比赛结束,准备清空跑道并继续跨栏比赛");
        }).start();
        for (int i = 0; i < 8; i++) {
            int finalI = i;
            new Thread(()->{
                try {
                    Thread.sleep(finalI * 1000L);
                    System.out.println(Thread.currentThread().getName()+"到达终点");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    //每执行一个线程countDownLatch中的state减1
                    countDownLatch.countDown();
                }
            }).start();
        }
    }
}


  • CyclicBarrier
  • CyclicBarrier(栅栏):表示当阻塞在这个 CyclicBarrier类上的线程达到一定数量的时候,才会同时唤醒所有阻塞在这个类上的其他线程继续向下执行。
  • CyclicBarrier和CountDownLatch的区别:CyclicBarrier是一群线程一起等待,当所有线程等待就绪了才可以一起向下执行;CountDownLatch是某个线程等待其他一群线程,只有这些线程都执行完毕以后,这个等待的线程才可以执行。
public class CyclicBarrierDemo {
    public static void main(String[] args) {
        //当在这个cyclicBarrier等待的线程达到8个时,才允许线程会唤醒所有等待在cyclicBarrier上的线程继续执行
        CyclicBarrier cyclicBarrier = new CyclicBarrier(8);
        for (int i = 0; i < 8; i++) {
            int finalI = i;
            new Thread(() -> {
                try {
                    Thread.sleep(finalI * 1000L);
                    System.out.println(Thread.currentThread().getName() + "准备就绪");
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() +" 开始比赛");
            }).start();
        }
    }
}


相关文章
|
8月前
|
传感器 人工智能 监控
可穿戴设备在运动领域的应用:科技让运动更智能
可穿戴设备在运动领域的应用:科技让运动更智能
436 9
|
11月前
|
前端开发 UED
React 文本区域组件 Textarea:深入解析与优化
本文介绍了 React 中 Textarea 组件的基础用法、常见问题及优化方法,包括状态绑定、初始值设置、样式自定义、性能优化和跨浏览器兼容性处理,并提供了代码案例。
378 10
|
PyTorch 算法框架/工具 Python
Traceback (most recent call last):WARNING: Dataset not found, nonexistent paths:
这篇文章描述了在使用YOLOv5进行训练时遇到的"Dataset not found"错误,分析了可能的原因,包括网络连接问题和数据集路径配置错误,并提供了相应的解决方法,如检查网络设置和确认数据集文件的存放位置。
Traceback (most recent call last):WARNING: Dataset not found, nonexistent paths:
|
Java 开发者 C++
Java多线程同步大揭秘:synchronized与Lock的终极对决!
Java多线程同步大揭秘:synchronized与Lock的终极对决!
236 5
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
解锁机器学习的新维度:元学习的算法与应用探秘
元学习作为一个重要的研究领域,正逐渐在多个应用领域展现其潜力。通过理解和应用元学习的基本算法,研究者可以更好地解决在样本不足或任务快速变化的情况下的学习问题。随着研究的深入,元学习有望在人工智能的未来发展中发挥更大的作用。
|
前端开发 开发者
深入解析CSS样式表的优先级
深入解析CSS样式表的优先级
311 1
|
关系型数据库 MySQL 大数据
教你使用Python玩转MySQL数据库,大数据导入不再是难题!
教你使用Python玩转MySQL数据库,大数据导入不再是难题!
308 1
|
人工智能 算法 定位技术
[AI aider] 打造终端AI搭档:Aider让编程更智能更有趣!
发现Aider,一个能在终端中与AI搭档编程的工具,让你的编程体验更智能、更有趣。
[AI aider] 打造终端AI搭档:Aider让编程更智能更有趣!
|
数据挖掘 测试技术 API
8个非常好用的 Python 效率工具
8个非常好用的 Python 效率工具
260 0
|
弹性计算 安全 Linux
幻兽帕鲁如何搭建服务器-幻兽帕鲁搭建服务器方法介绍
幻兽帕鲁如何搭建服务器-幻兽帕鲁搭建服务器方法介绍,如何自建幻兽帕鲁服务器?基于阿里云服务器搭建幻兽帕鲁palworld服务器教程来了,一看就懂系列。本文是利用OOS中幻兽帕鲁扩展程序来一键部署幻兽帕鲁服务器,阿里云百科分享官方基于阿里云服务器快速创建幻兽帕鲁服务器教程
2545 5