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

阅读: 评论:0

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

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

目录

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

一、CyclicBarrier的理解

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

二、CyclicBarrier类中常用的方法

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

三、CyclicBarrier类的使用示例一

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

1、代码

hread.CyclicBarrier;import java.util.Random;
import urrent.CyclicBarrier;/*** @description:* @author: xz* @create: 2021-05-30 21:46*/
public class Demo {Random random=new Random();//参加会议方法public void joinMeet(CyclicBarrier barrier){try {Thread.Int(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、代码

hread.CyclicBarrier;import java.util.Random;
import urrent.CyclicBarrier;/*** @description:* @author: xz* @create: 2021-05-30 21:46*/
public class Demo {Random random=new Random();//参加会议方法public void joinMeet(CyclicBarrier barrier){try {Thread.Int(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个人已到齐,开始开会。”);

本文发布于:2024-01-28 05:55:54,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17063925585285.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:栅栏   多线程   工具   Java   CyclicBarrier
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23