package com.brendan.cn.concurrent.match;
import java.util.concurrent.Phaser;
public class Match {
// 模拟了100米赛跑,10名选手,只等裁判一声令下。当所有人都到达终点时,比赛结束。
public static void main(String[] args) throws InterruptedException {
final Phaser phaser=new Phaser(10) ;
phaser.register();
// 十名选手
for (int index = 0; index < 10; index++) {
new Thread(new Player(phaser),"player"+index).start();
}
System.out.println("Game Start");
phaser.arriveAndAwaitAdvance();
System.out.println("预备 。。。。");
phaser.arriveAndAwaitAdvance();
System.out.println("跑 。跑 。跑 。。。");
phaser.arriveAndDeregister();
//是否非终止态一直等待
while (!phaser.isTerminated()){
}
System.out.println("Game Over");
}
static class Player implements Runnable {
private final Phaser phaser;
Player(Phaser phaser) {
this.phaser = phaser;
}
@Override
public void run() {
try {
// 第一阶段——等待创建好所有线程再开始
phaser.arriveAndAwaitAdvance();
// 第二阶段——等待所有选手准备好再开始
Thread.sleep((long) (Math.random() * 10000));
System.out.println(Thread.currentThread().getName() + " ready"+ " , Phase :"
+ phaser.getPhase());
phaser.arriveAndAwaitAdvance();
// 第三阶段——等待所有选手准备好到达,到达后,该线程从phaser中注销,不在进行下面的阶段。
Thread.sleep((long) (Math.random() * 10000));
System.out.println(Thread.currentThread().getName() + " arrived" + " , Phase :"
+ phaser.getPhase());
phaser.arriveAndDeregister();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
phaser模拟百米赛跑
最新推荐文章于 2024-03-23 23:26:59 发布