Java并发多线程编程——并发工具类CyclicBarrier(回环栅栏)

2024-01-21 16:50

本文主要是介绍Java并发多线程编程——并发工具类CyclicBarrier(回环栅栏),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • 一、CyclicBarrier的理解
    • 二、CyclicBarrier类中常用的方法
    • 三、CyclicBarrier类的使用示例一
    • 四、CyclicBarrier类的使用示例二

一、CyclicBarrier的理解

  • CyclicBarrier属于java.util.concurrent包下;
  • CyclicBarrier字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行,叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用,我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了。

二、CyclicBarrier类中常用的方法

在这里插入图片描述

  • public int await() :用来挂起当前线程,直至所有线程都到达barrier状态再同时执行后续任务;
  • public int await(long timeout, TimeUnit unit):让这些线程等待至一定的时间,如果还有线程没有到达barrier状态就直接让到达barrier的线程执行后续任务。

三、CyclicBarrier类的使用示例一

使用场景,例如有10个人参加会议,等10个人都到齐后,才开始会议。注(示例中每个线程代表一个人。)

1、代码

package com.xz.thread.CyclicBarrier;import java.util.Random;
import java.util.concurrent.CyclicBarrier;/*** @description:* @author: xz* @create: 2021-05-30 21:46*/
public class Demo {Random random=new Random();//参加会议方法public void joinMeet(CyclicBarrier barrier){try {Thread.sleep(random.nextInt(4000));} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+" 到达会议室,【等待开会】.......");try {//挂起当前线程,直至所有线程都到达barrier状态再同时执行后续任务。barrier.await();} catch (Exception e) {e.printStackTrace();}}//主方法,用于测试public static void main(String[] args) {Demo d =new Demo();//创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,//并在启动 barrier 时执行给定的屏障操作,该操作由最后一个进入 barrier 的线程执行。CyclicBarrier barrier = new CyclicBarrier(10, new Runnable() {@Overridepublic void run() {System.out.println("10个人已到齐,开始开会。");}});//创建10个线程,每个线程代表一个人开会。for(int i=0;i<10;i++){new Thread(new Runnable() {@Overridepublic void run() {d.joinMeet(barrier);}}).start();}}
}

2、运行main函数,输出结果如下:

在这里插入图片描述
3、结论

  • 由第2步骤输出截图可知,当调用await()方法之后,挂起当前线程,当前线程就处于barrier了,直至所有线程都到达barrier状态再同时执行后续任务。

四、CyclicBarrier类的使用示例二

使用场景,例如有10个人参加会议,等10个人都到齐后,才开始会议。注(示例中每个线程代表一个人。其中一个线程抛出异常)

1、代码

package com.xz.thread.CyclicBarrier;import java.util.Random;
import java.util.concurrent.CyclicBarrier;/*** @description:* @author: xz* @create: 2021-05-30 21:46*/
public class Demo {Random random=new Random();//参加会议方法public void joinMeet(CyclicBarrier barrier){try {Thread.sleep(random.nextInt(4000));} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+" 到达会议室,【等待开会】.......");//如果线程名称等于Thread-1,则抛出运行时异常if(Thread.currentThread().getName().equals("Thread-1")){throw new RuntimeException();}try {//挂起当前线程,直至所有线程都到达barrier状态再同时执行后续任务。barrier.await();} catch (Exception e) {e.printStackTrace();}}//主方法,用于测试public static void main(String[] args) {Demo d =new Demo();//创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,//并在启动 barrier 时执行给定的屏障操作,该操作由最后一个进入 barrier 的线程执行。CyclicBarrier barrier = new CyclicBarrier(10, new Runnable() {@Overridepublic void run() {System.out.println("10个人已到齐,开始开会。");}});//创建10个线程,每个线程代表一个人开会。for(int i=0;i<10;i++){new Thread(new Runnable() {@Overridepublic void run() {d.joinMeet(barrier);}}).start();}}
}

2、运行main函数,输出结果如下:
在这里插入图片描述在这里插入图片描述

3、结论

  • 由第2步骤输出截图可知,如果某一线程抛出异常后,就不会在调用await()方法,所以后续的任务不会在执行,即没有输出 System.out.println(“10个人已到齐,开始开会。”);

这篇关于Java并发多线程编程——并发工具类CyclicBarrier(回环栅栏)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/630195

相关文章

Java中的Cursor使用详解

《Java中的Cursor使用详解》本文介绍了Java中的Cursor接口及其在大数据集处理中的优势,包括逐行读取、分页处理、流控制、动态改变查询、并发控制和减少网络流量等,感兴趣的朋友一起看看吧... 最近看代码,有一段代码涉及到Cursor,感觉写法挺有意思的。注意是Cursor,而不是Consumer

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值

前端知识点之Javascript选择输入框confirm用法

《前端知识点之Javascript选择输入框confirm用法》:本文主要介绍JavaScript中的confirm方法的基本用法、功能特点、注意事项及常见用途,文中通过代码介绍的非常详细,对大家... 目录1. 基本用法2. 功能特点①阻塞行为:confirm 对话框会阻塞脚本的执行,直到用户作出选择。②

Docker部署Jenkins持续集成(CI)工具的实现

《Docker部署Jenkins持续集成(CI)工具的实现》Jenkins是一个流行的开源自动化工具,广泛应用于持续集成(CI)和持续交付(CD)的环境中,本文介绍了使用Docker部署Jenkins... 目录前言一、准备工作二、设置变量和目录结构三、配置 docker 权限和网络四、启动 Jenkins

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

Java实战之利用POI生成Excel图表

《Java实战之利用POI生成Excel图表》ApachePOI是Java生态中处理Office文档的核心工具,这篇文章主要为大家详细介绍了如何在Excel中创建折线图,柱状图,饼图等常见图表,需要的... 目录一、环境配置与依赖管理二、数据源准备与工作表构建三、图表生成核心步骤1. 折线图(Line Ch

Spring Boot 3 整合 Spring Cloud Gateway实践过程

《SpringBoot3整合SpringCloudGateway实践过程》本文介绍了如何使用SpringCloudAlibaba2023.0.0.0版本构建一个微服务网关,包括统一路由、限... 目录引子为什么需要微服务网关实践1.统一路由2.限流防刷3.登录鉴权小结引子当前微服务架构已成为中大型系统的标

Java集合中的List超详细讲解

《Java集合中的List超详细讲解》本文详细介绍了Java集合框架中的List接口,包括其在集合中的位置、继承体系、常用操作和代码示例,以及不同实现类(如ArrayList、LinkedList和V... 目录一,List的继承体系二,List的常用操作及代码示例1,创建List实例2,增加元素3,访问元

Python中多线程和多进程的基本用法详解

《Python中多线程和多进程的基本用法详解》这篇文章介绍了Python中多线程和多进程的相关知识,包括并发编程的优势,多线程和多进程的概念、适用场景、示例代码,线程池和进程池的使用,以及如何选择合适... 目录引言一、并发编程的主要优势二、python的多线程(Threading)1. 什么是多线程?2.