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模擬百米賽跑
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.