package com.zl1030.Phaser;

import java.util.concurrent.Phaser;

public class Bot implements Runnable {
    private Phaser phaser;
    private int id;

    public Bot(int id, Phaser phaser) {
        super();
        this.id = id;
        this.phaser = phaser;
    }

    public void run() {
        try {
            for (int i = 0; i < 5; i++) {
                System.out.println("id:" + id + " wait...");
                Thread.sleep((long) (Math.random() * 5000));
                System.out.println("id:" + id + " arrive phase: " + phaser.getPhase());
                phaser.arriveAndAwaitAdvance();
                System.out.println("id:" + id + " after wait");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
package com.zl1030.Phaser;

import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Phaser;

public class Test {
    public static void main(String... args) throws Exception {
        Phaser phaser = new Phaser() {

            @Override
            protected boolean onAdvance(int phase, int registeredParties) {
                System.out.println("=====================phase:" + phase + " arrived!============================");
                return false;
            }

        };

        int botNum = 3;

        phaser.bulkRegister(botNum + 1);

        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < botNum; i++) {
            executorService.execute(new Bot(i + 1, phaser));
        }

        Scanner s = new Scanner(System.in);
        System.out.println("请输入字符串:");
        while (true) {
            String line = s.nextLine();

            if (line.equals("exit")) {
                System.out.println("Bye!");
                System.exit(0);
            } else {
                switch (line) {
                case "add":
                    phaser.bulkRegister(1);
                    botNum += 1;
                    executorService.execute(new Bot(botNum, phaser));
                    break;
                case "state":
                    System.out.println("phase: " + phaser.getPhase() + " arrivedParties:" + phaser.getArrivedParties()
                            + "/" + botNum);
                    break;
                case "continue":
                    phaser.arriveAndAwaitAdvance();
                    break;
                }
                System.out.println(">>>" + line);
            }
        }

    }

}