使用CyclicBarrier模拟百米赛跑
什么是CyclicBarrier
字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。
怎么使用CyclicBarrier
1:创建 CyclicBarrier ,并在构造函数参数里指定 需要等待的线程数量。 CyclicBarrier barrier =new CyclicBarrier(3);
2: 对应线程在运行的时候,调用 barrier.await(),表示准备就绪,这时barrier等待的数量count 将减1 ;
3:当barrier.count=0的时候,将打开栅栏,所有线程一起启动。
使用CyclicBarrier模拟百米赛跑
大概流程:
1:三个人参赛,三个都准备。
2:开始,响汽鸣枪
3:起跑。
4:完成。
原代码
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierTest {
public static void main(String[] args) throws BrokenBarrierException, InterruptedException {
CyclicBarrier barrier = new CyclicBarrier(3,()->{
System.out.println("-------汽鸣枪声-------");
});
Athletes a = new Athletes(barrier, "张三", 10);
Athletes b = new Athletes(barrier, "李四", 9);
Athletes c = new Athletes(barrier, "王五", 11);
a.start();
b.start();
c.start();
}
//运作员
public static class Athletes extends Thread {
CyclicBarrier barrier;
int speed;
String athleteName;
public Athletes(CyclicBarrier barrier, String name, int speed) {
this.barrier = barrier;
this.speed = speed;
this.athleteName = name;
}
@Override
public void run() {
System.out.println(String.format("我是%s,我的百米速度是%s,准备就绪!", this.athleteName, this.speed));
try {
this.barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(String.format("我是%s,开始跑!", this.athleteName));
try {
Thread.sleep(this.speed * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(String.format("我是%s,到达终点!", this.athleteName));
}
}
}
输出结果
我是张三,我的百米速度是10,准备就绪!
我是李四,我的百米速度是9,准备就绪!
我是王五,我的百米速度是11,准备就绪!
-------汽鸣枪声-------
我是王五,开始跑!
我是张三,开始跑!
我是李四,开始跑!
我是李四,到达终点!
我是张三,到达终点!
我是王五,到达终点!