【JAVA高级】并发同步工具CyclicBarrier 的使用介绍

news2024/9/21 12:32:41

📝个人主页🌹:个人主页
⏩收录专栏⏪:JAVA进阶
🌹🌹期待您的关注 🌹🌹,让我们共同进步!
在这里插入图片描述

文章目录

    • CyclicBarrier 简介
    • CyclicBarrier 的场景示意图:
      • 单次屏障作用示意:
      • 循环的屏障作用示意:
    • CyclicBarrier 的主要方法包括:
    • CyclicBarrier 使用

CyclicBarrier 简介

CyclicBarrier 是 Java 中的另一个同步辅助类,它可以让一组线程互相等待,直到所有线程都达到一个屏障点后再继续执行。与
CountDownLatch 不同的是,CyclicBarrier
的计数器可以循环使用,当所有线程都到达屏障点后,计数器会重置,可以被复用。 所谓 Cyclic 即循环的意思,所谓 Barrier
即屏障的意思。所以综合起来,CyclicBarrier 指的就是循环屏障,虽然这个叫法很奇怪,但是却能很好地表达其含义

CyclicBarrier 的场景示意图:

单次屏障作用示意:

在这里插入图片描述

循环的屏障作用示意:

在这里插入图片描述

CyclicBarrier 的主要方法包括:

  • 构造方法:CyclicBarrier(int parties) 构造一个 CyclicBarrier 对象,指定参与线程的数量 parties。
  • await():让当前线程等待,直到所有参与线程都到达屏障点。

CyclicBarrier 的典型用法包括:

  • 多个线程分阶段执行任务,每个阶段结束后等待其他线程,然后一起执行下一个阶段。
  • 多个线程同时执行不同任务,等待所有任务完成后再进行下一步操作。

CyclicBarrier 使用

案例一:计算10个员工的平均薪资

package com.atguigu.signcenter.nosafe;

import java.util.Set;
import java.util.concurrent.*;

/** 
 * 使用循环栅栏求五个人的平均薪资
 * @author: jd
 * @create: 2024-09-04
 */
public class CyclicBarrierDemo {

    private static final int STUDENT_COUNT =10;
    //存储工人姓名及工资
    private ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap<String,Integer>();
    private ExecutorService executorService =Executors.newFixedThreadPool(10);

    public void avgScore() throws InterruptedException {
        CyclicBarrier  cyclicBarrier =new CyclicBarrier(10);
        for (int i = 0; i < STUDENT_COUNT; i++) {
            executorService.submit(()->{
                //获取工人的工资,这里随机生成工资
                int score = (int) (Math.random() * 3000 + 5000);
                concurrentHashMap.put(Thread.currentThread().getName(),score);
                System.out.println(Thread.currentThread().getName()+"对应的工资为:"+score);

                try {
                    //执行完运行 await 等待所有工人的工资都计算完毕
                    cyclicBarrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
            });
        }
        Thread.sleep(2000);
        if(cyclicBarrier.getNumberWaiting() ==0){
            int totalNumber = 0;
            Set<String> set =concurrentHashMap.keySet();
            for (String s : set) {
                totalNumber+=(int)concurrentHashMap.get(s);
            }
            System.out.println("五位工人的平均工资为:" + (totalNumber / STUDENT_COUNT) + "元");
        }
        System.out.println("========计算完毕========");
        executorService.shutdown();
    }




    public static void main(String[] args) throws InterruptedException {
        CyclicBarrierDemo cyclicBarrierDemo = new CyclicBarrierDemo();
        cyclicBarrierDemo.avgScore();

    }

}

结果:

pool-1-thread-7对应的工资为:5210
pool-1-thread-3对应的工资为:6376
pool-1-thread-5对应的工资为:7101
pool-1-thread-2对应的工资为:5388
pool-1-thread-10对应的工资为:6609
pool-1-thread-1对应的工资为:5067
pool-1-thread-4对应的工资为:7341
pool-1-thread-8对应的工资为:5228
pool-1-thread-6对应的工资为:6683
pool-1-thread-9对应的工资为:5430
五位工人的平均工资为:6043元
========计算完毕========

案例2:

现在要模拟一个所有员工都到达公园之后,进行马拉松比赛的一个过程,等待员工都进行完比赛之后,开始颁奖晚会。

先编写人出发,到公园,最后的表演节目的代码

package com.atguigu.signcenter.nosafe;

import java.util.concurrent.*;

/**
 * 现在要模拟一个所有员工都到达公园之后,进行马拉松比赛的一个过程,等待员工都进行完比赛之后,开始颁奖晚会。
 * 循环屏障演示到达公园,最后的表演一个节目
 * @author: jd
 * @create: 2024-09-05
 */
public class CyclicBarrierDemo2 {
    private static final int PEOPLE_COUNT =10;
    // 创建一个线程池来执行任务
    static final ThreadPoolExecutor executor = new ThreadPoolExecutor(10,20,30L,
            TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>(),Executors.defaultThreadFactory());

    /**
     * 模拟10个人分别 出发去公园
     */
    public void goParkTogether(){

        CyclicBarrier cyclicBarrier =new CyclicBarrier(10,()->{
            try {
                Thread.sleep(3000);
                System.out.println("因为" + Thread.currentThread().getName() + "最后到我给大家表演一个节目,先解解闷,再开始比赛");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        //启动10个线程,分别模拟十个人出发去公园及在公园路上花费的时间
        for (int i = 0; i < PEOPLE_COUNT; i++) {
            executor.submit(()->{
                try {
                    //模拟路上花费的时间
                    Thread.sleep(2000);
                    System.out.println(Thread.currentThread().getName()+"已经到达");
                    //到屏障了进行等待
                    cyclicBarrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }

            });
        }



    }

    public static void main(String[] args) {
        CyclicBarrierDemo2 cyclicBarrierDemo2 = new CyclicBarrierDemo2();
        cyclicBarrierDemo2.goParkTogether();
    }


}

结果:

pool-1-thread-8已经到达
pool-1-thread-4已经到达
pool-1-thread-3已经到达
pool-1-thread-2已经到达
pool-1-thread-7已经到达
pool-1-thread-10已经到达
pool-1-thread-6已经到达
pool-1-thread-9已经到达
pool-1-thread-1已经到达
pool-1-thread-5已经到达
因为pool-1-thread-5最后到我给大家表演一个节目,再开始比赛

两种写法上稍稍有差异,第一个是通过判断在等待的线程还有没有,如果没有了则执行最后的内容;第二种则是在创建栅栏的时候指定了,等所有线程执行完毕后会执行的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2107517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI绘画时代的自媒体引流攻略:如何实现粉丝暴涨与盈利

一、AI绘画在自媒体引流和赚钱中的应用 创作独特视觉内容&#xff0c;吸引粉丝关注 AI绘画技术可以帮助自媒体从业者创作出独一无二的视觉内容&#xff0c;这些内容在社交媒体上具有很高的辨识度和吸引力。通过以下方式&#xff0c;AI绘画助力引流和赚钱&#xff1a; &#xf…

软件厂商与集成平台协同--打造无缝企业解决方案

引言 在现在的众多项目当中&#xff0c;很多企业面临着日益复杂的业务需求和不断变化的市场环境。为了保持竞争力&#xff0c;企业会选择采用高效的工具和系统来管理和运营。CRM&#xff08;客户关系管理&#xff09;软件和ERP&#xff08;企业资源规划&#xff09;系统是企业…

PMF源解析软件下载、安装、运行;Fpeak模式运行结果优化及误差评估;大气颗粒物理化性质等基础知识和通过PMF方法对其来源解析

目录 专题一 PMF源解析技术简要及其输入文件准备 专题二 PMF源解析技术的原理&#xff0c;PMF软件的实操及应用举例 专题三 PMF源解析结果的优化及误差评估 更多应用 颗粒物污染不仅对气候和环境有重要影响&#xff0c;而且对人体健康有严重损害&#xff0c;尤其在一些重污…

计算机毕设选题推荐-基于python的校园班级课程表管理系统

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、基于python的校园班级课程表…

【C++】简述STL——string类的使用

文章目录 一、STL的简述1.STL的框架2.STL版本 二、string1、string的介绍2、为什么string类要实现为模板&#xff1f; 三、string的构造接口四、string的容量相关的接口五、string对象修改相关的接口1、insert2.earse3、assign4、replace 六、string对象字符串运算相关接口1、c…

【Linux】《Linux 常见指令全攻略》

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

JavaScript 知识:this、apply/call/bind、Promise、async/await、HTTP 库 Axios

1、变量、声明、传递 (值、引用) javascript:void(0) 含义 javascript:void(0) 中最关键的是 void 关键字&#xff0c; void 是 JavaScript 中非常重要的关键字&#xff0c;该操作符指定要计算一个表达式但是不返回值。void() 仅仅是代表不返回任何值&#xff0c;但是括号内的表…

【C++ 第二十章】智能指针

1.为什么需要智能指针&#xff1f; 下面我们先分析一下下面这段程序有没有什么内存方面的问题&#xff1f;提示一下&#xff1a;注意分析下面 Func 函数中的问题。 #include<exception> int div() {int a, b;cin >> a >> b;if (b 0)throw invalid_argume…

【Python基础】这篇文章带你了解Python的基本特点,让学习Python变得事半功倍!!!

一、Python的基本特点 简单易学&#xff1a;Python语法简洁清晰&#xff0c;拥有极其简单的说明文档&#xff0c;对于初学者来说非常友好。面向对象&#xff1a;Python既支持面向过程的编程也支持面向对象的编程&#xff0c;这使得Python能够灵活地应对各种编程需求。可移植性…

投放Facebook广告开户全流程解析:从开户到广告投放的实用指南

Facebook作为全球最大的社交平台之一&#xff0c;广告业务覆盖范围广泛&#xff0c;已成为各类企业推广产品和服务的重要渠道。要在Facebook上成功投放广告&#xff0c;首先需要完成广告账户的开户流程。本文将详细介绍投放Facebook广告开户的步骤和条件&#xff0c;并解释如何…

VBA Excel 出报表

源数据 目标 PS:调休 以高亮颜色区分 整理一下 CMDBUT命令 VBA代码 Private Sub CommandButton1_Click() Dim ps As Integer Dim pe As Integer Dim srcs As Integer Dim srce As Integer Dim i As Integer Dim j As Integer Dim m As Integer Dim pname As Variant Dim pn…

力扣刷题--442. 数组中重复的数据【中等】

题目描述 给你一个长度为 n 的整数数组 nums &#xff0c;其中 nums 的所有整数都在范围 [1, n] 内&#xff0c;且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数&#xff0c;并以数组形式返回。 你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间&am…

【深度学习】线性回归的从零开始实现与简洁实现

前言 我原本后面打算用李沐老师那本《动手学深度学习》继续“抄书”&#xff0c;他们团队也免费提供了电子版(https://zh-v2.d2l.ai/d2l-zh-pytorch.pdf)。但书里涉及到代码&#xff0c;一方面展示起来不太方便&#xff0c;另一方面我自己也有很多地方看不太懂。 这让我开始思…

栈和队列的习题详解(2):用队列实现栈

前言&#xff1a; 小编在上一篇博客写了栈和队列其中一个习题&#xff0c;为了体现出题目的重要性所以我把每个题目都分开写了&#xff0c;下面废话不多说&#xff0c;开启我们今天的做题之旅~ 目录 1.用队列实现栈 1.1.题目介绍 1.2.做题方法介绍 1.3.栈功能的实现 1.3.1.…

天聚数行®近期上线了六个实用的API接口

天聚数行近期上线了一系列实用的API接口服务&#xff0c;涵盖了多种场景下的数据处理和信息查询的需求&#xff0c;为企业和开发者带来了便捷高效的工具支持。这些服务包括工商信息查询、手机状态检测&#xff08;如在网状态和空号检测&#xff09;、坐标系转换等功能&#xff…

飞利浦的精益转型之路:从传统制造到智能制造的华丽蜕变

飞利浦作为一家拥有百年历史的全球知名品牌&#xff0c;其在精益转型方面的经验值得我们深入研究和借鉴。本文将从飞利浦的转型背景、转型过程、转型成效以及给我们的启示等方面&#xff0c;探讨飞利浦如何成功实现精益转型&#xff0c;从而在新的市场竞争中脱颖而出。 一、转型…

沐渥科技:两显氮气柜和三显氮气柜要怎么选择?

两显氮气柜通常指的是控制面板上有两个LED数码显示界面&#xff0c;用于显示温度和湿度&#xff1b;三显氮气柜则有三个LED数码显示界面&#xff0c;能够直观地显示出温度、湿度和含氧量。这样的设计便于用户快速全面地了解柜内环境状态&#xff0c;不需要额外的操作即可掌握所…

录屏神器!这四款免费版助你轻松成为剪辑大师

在数字化的时代&#xff0c;录屏软件已经成为了我们工作和学习中的得力助手。对于需要记录电脑屏幕操作&#xff0c;或是制作教学视频、游戏解说等内容的用户来说&#xff0c;一款好用的录屏软件是必不可少的&#xff1b;这篇文章将分享四款免费录屏软件&#xff1a; 第一款&a…

深度学习(九)-图像形态操作

仿射变换 仿射变换是指图像可以通过一系列的几何变换来实现平移、旋转等多种操作。该变换能够保持图像的平直性和平行性。平直性是指图像经过仿射变换后&#xff0c;直线仍然是直线&#xff1b;平行性是指图像在完成仿射变换后&#xff0c;平行线仍然是平行线。 平移 镜像 旋转…

spark读取csv文件

测试spark读取本地和hdfs文件 from pyspark.sql import SparkSessionspark SparkSession.builder \.appName("Example PySpark Script") \.getOrCreate()# 读取本地csv文件 df spark.read.csv("/Users/xiaokkk/Desktop/local_projects/spark/intents.csv&quo…