package com.example.sina.thread;
import java.util.concurrent.Phaser;
public class PhaserTest {
public static void main(String[] args) throws InterruptedException {
Phaser phaser = new Phaser();
PhaserWorker[] phaserWorkers = new PhaserWorker[5];
for (int i = 0; i < phaserWorkers.length; i++) {
phaser.register();
phaserWorkers[i] = new PhaserWorker(phaser);
new Thread(new PhaserWorker(phaser)).start();
}
}
static class PhaserWorker implements Runnable {
private final Phaser phaser;
public PhaserWorker(Phaser phaser) {
this.phaser = phaser;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " | 到達" );
phaser.arriveAndAwaitAdvance(); // 集合完畢發車
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " | 到達" );
phaser.arriveAndAwaitAdvance(); // 景點 1 集合完畢發車
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " | 到達" );
phaser.arriveAndAwaitAdvance(); // 景點 2 集合完畢發車
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// Phaser 每個階段完成之後的事件通知
static class MyPhaser extends Phaser {
@Override
protected boolean onAdvance(int phase, int registeredParties) {
// 每個階段執行完之後的回調
switch (phase) {
case 0:
System.out.println("==== 集合完畢發車 ====");
return false;
case 1:
System.out.println("==== 景點1集合完畢,發車去下一個景點 ====");
return false;
case 2:
System.out.println("==== 景點2集合完畢,發車回家 ====");
return false;
default:
return true;
}
}
}
}