Java并发多线程编程——并发工具类CyclicBarrier(回环栅栏)
Posted 小志的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java并发多线程编程——并发工具类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() {
@Override
public void run() {
System.out.println("10个人已到齐,开始开会。");
}
});
//创建10个线程,每个线程代表一个人开会。
for(int i=0;i<10;i++){
new Thread(new Runnable() {
@Override
public 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() {
@Override
public void run() {
System.out.println("10个人已到齐,开始开会。");
}
});
//创建10个线程,每个线程代表一个人开会。
for(int i=0;i<10;i++){
new Thread(new Runnable() {
@Override
public void run() {
d.joinMeet(barrier);
}
}).start();
}
}
}
2、运行main函数,输出结果如下:
3、结论
- 由第2步骤输出截图可知,如果某一线程抛出异常后,就不会在调用await()方法,所以后续的任务不会在执行,即没有输出 System.out.println(“10个人已到齐,开始开会。”);
以上是关于Java并发多线程编程——并发工具类CyclicBarrier(回环栅栏)的主要内容,如果未能解决你的问题,请参考以下文章
Java并发多线程编程——并发工具类CountDownLatch(线程计数器)
Java并发多线程编程——并发工具类CyclicBarrier(回环栅栏)
Java并发多线程编程——并发工具类Semaphore(信号量)
Java多线程系列:CountDownLatchSemaphore等4大并发工具类详解