Phaser

阶段执行器,跟Barrier有点类似。

分阶段执行,一个阶段中所有的线程都执行完了再执行下一个阶段的线程。

下面的代码是模仿一对新人结婚的场景:1. 等所有人到齐了  2. 等所有人都吃完了 3.等所有人都离开了 4. 新人入洞房。这四个步骤分为四个阶段执行。

假设婚礼参加都人数算上新人一共有7个人,那么左后所有人全部走了后,,只有新郎新娘两个人入洞房。每一个阶段还会打印出参与都人数。

public class TestPhaser {
    static Random r = new Random();
    static MarriagePhaser phaser = new MarriagePhaser();


    static void milliSleep(int milli) {
        try {
            TimeUnit.MILLISECONDS.sleep(milli);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    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();

    }



    static class MarriagePhaser extends 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