public class PhaserDemo {
static MarriagePhaser phaser = new MarriagePhaser();
// 定义结婚阶段类
static class MarriagePhaser extends Phaser {
// 定义每个阶段要执行的任务, 返回值为为true时,代表phaser终止,否则继续执行
@Override
protected boolean onAdvance(int phase, int registeredParties) {
switch (phase) {
case 0:
System.out.println("所有人都到齐了!共有" + registeredParties + "人");
System.out.println();
return false;
case 1:
System.out.println("新郎新娘拜堂!共有" + registeredParties + "人");
System.out.println();
return false;
case 2:
System.out.println("所有人酒席吃完了!共有" + registeredParties + "人");
System.out.println();
return false;
case 3:
System.out.println("所有人都离开了!共有" + registeredParties + "人");
System.out.println();
return false;
case 4:
System.out.println("新郎新娘入洞房!共有" + registeredParties + "人");
System.out.println();
return true;
}
return super.onAdvance(phase, registeredParties);
}
}
// 定义人线程
static class Person extends Thread {
Person (String name) {
setName(name);
}
// 到达现场
private void arrive() {
System.out.println(getName() + "到达");
phaser.arriveAndAwaitAdvance(); // 到达并等待
}
// 拜堂
private void chapel() {
if (getName().equals("新郎") || getName().equals("新娘")) {
System.out.println(getName() + "拜堂了");
phaser.arriveAndAwaitAdvance();
} else {
phaser.arriveAndDeregister();
}
}
// 酒席
private void eat() {
if (!getName().equals("新郎") && !getName().equals("新娘")) {
phaser.register();
}
System.out.println(getName() + "吃了");
phaser.arriveAndAwaitAdvance();
}
// 离开
private void leave() {
System.out.println(getName() + "离开了");
phaser.arriveAndAwaitAdvance();
}
// 洞房
private void papapa() {
if (getName().equals("新郎") || getName().equals("新娘")) {
System.out.println(getName() + "洞房了");
phaser.arriveAndAwaitAdvance();
}else {
phaser.arriveAndDeregister();
}
}
@Override
public void run() {
arrive();
chapel();
eat();
leave();
papapa();
}
}
public static void main(String[] args) {
phaser.bulkRegister(7);
for(int i=0; i<5; i++) {
new Thread(new Person("p" + i)).start();
}
new Thread(new Person("新郎")).start();
new Thread(new Person("新娘")).start();
}
}