java.util.concurrent.CyclicBarrier 概述:
CyclicBarrier的字面意思是可循环使用(cyclic)的屏障(barrier)
它要做的事情,是让一组线程到达一个屏障(也叫做同步点)时被阻塞,
直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续执行
API:
构造方法:
public CyclicBarrier(int parties , Runnable barrierAction)
参数1 parties:代表要达到屏障的线程数量
参数2 barrierAction:表示达到屏障后要执行的任务
成员方法:
public int await(): 每个线程调用await方法 告诉 CyclicBarrier对象我已经到达了屏障,然后当前线程就会被阻塞
例如:公司着急5个程序员开会,等5名程序员都到了之后,会议才开始
分析:
1. 五名程序员,就需要五条线程来表示
2. 五条线程的任务都一样
到达会议室、
调用await方法告CyclicBarrier,当前线程到达了屏障,也就是已经来到了办公室,当前线程进入阻塞状态
开会
离开会议室
public class Runnable1 implements Runnable{
CyclicBarrier cb;
public Runnable1(CyclicBarrier cb) {
this.cb = cb;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"到达会议室");
// 调用await方法 告诉 CyclicBarrier,当前线程到了屏障,然后当前线程阻塞
try {
cb.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"离开会议室");
}
}
public class Tests {
public static void main(String[] args) {
// 创建CyclicBarrier对象
CyclicBarrier cb = new CyclicBarrier(5, new Runnable() {
@Override
public void run() {
System.out.println("五名程序员全部到齐,然后开会");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("会议结束,大家开始工作");
}
});
// 启动五条线程,代表五个员工
Runnable1 r1= new Runnable1(cb);
new Thread(r1,"员工1").start();
new Thread(r1,"员工2").start();
new Thread(r1,"员工3").start();
new Thread(r1,"员工4").start();
new Thread(r1,"员工5").start();
}
}