CyclicBarrier根据官方文档的说明:一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待;
用人的话来说就是:一组线程在并发的执行过程中,设置一个公共点,只有当每个线程都达到这个公共点的时候,所有的线程才会抢占cpu资源继续运行,否则到达公共点的线程都必须得等待;
构造方法:
CyclicBarrier(int parties) | parties设置到达屏障点线程的数量,只有到达parties,才会继续执行,否则await() |
CyclicBarrier(int parties, Runnable barrierAction) | 可以继承一个runable接口里面写入子任务,给最后一个到达的线程执行 |
int | await() 在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。 |
int | await(long timeout, TimeUnit unit) 在所有参与者都已经在此屏障上调用 await 方法之前将一直等待,或者超出了指定的等待时间。 |
int | getNumberWaiting() 返回当前在屏障处等待的参与者数目。 |
int | getParties() 返回要求启动此 barrier 的参与者数目。 |
boolean | isBroken() 查询此屏障是否处于损坏状态。 |
void | reset() 将屏障重置为其初始状态。 |
接下里用一个实例来介绍一波barrier用法:
开学了,有多个同学来学校交作业,只有当老师喊一声交作业了,所有同学才能开始交作业,运用多线程来模拟此过程
package 多线程;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class cyclicbarrier用法 {
/*
* 该用法就是在多个线程同步执行的时候设置一个屏障点,每个线程到达那个屏障点的时候都需要等待
* 等到所有人都到达屏障点的时候才执行屏障点所指定的任务
* 最后再执行每个任务还没有执行完成的剩下的任务
* 该屏障点就是cyclicbarrier对象,每个任务执行到该对象执行的await()方法都停下来,直到达到设置的屏障点的数目,再往后执行
*/
public void meeting(CyclicBarrier barrier){
System.out.println(Thread.currentThread().getName()+"我们来学校了");
try {
Thread.sleep(1000);
barrier.await();//等待其他人一起交作业
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"交了作业");
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
final CyclicBarrier barrier=new CyclicBarrier(5, new Runnable() {
@Override
public void run() {
// TODO 自动生成的方法存根
System.out.println("大家准备开始交作业");
}
});
final cyclicbarrier用法 m=new cyclicbarrier用法();
for (int i = 0; i < 5; i++) {
new Thread(new Runnable() {
@Override
public void run() {
// TODO 自动生成的方法存根
m.meeting(barrier);
}
}).start();
}
}
}
最终的结果是
喜欢的记得点个关注哟!