zoukankan      html  css  js  c++  java
  • 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;
                    case 3:
                        System.out.println("婚礼结束!新郎新娘抱抱!" + registeredParties);
                        return true;
                    default:
                        return true;
                }
            }
        }
    
    
        static class Person implements Runnable {
            String name;
    
            public Person(String name) {
                this.name = name;
            }
    
            public void arrive() {
    
                milliSleep(r.nextInt(1000));
                System.out.printf("%s 到达现场!
    ", name);
                phaser.arriveAndAwaitAdvance();
            }
    
            public void eat() {
                milliSleep(r.nextInt(1000));
                System.out.printf("%s 吃完!
    ", name);
                phaser.arriveAndAwaitAdvance();
            }
    
            public void leave() {
                milliSleep(r.nextInt(1000));
                System.out.printf("%s 离开!
    ", name);
    
    
                phaser.arriveAndAwaitAdvance();
            }
    
            private void hug() {
                if(name.equals("新郎") || name.equals("新娘")) {
                    milliSleep(r.nextInt(1000));
                    System.out.printf("%s 洞房!
    ", name);
                    phaser.arriveAndAwaitAdvance();
                } else {
                    phaser.arriveAndDeregister();
                    //phaser.register()
                }
            }
    
            @Override
            public void run() {
                arrive();
    
                eat();
    
                leave();
    
                hug();
    
            }
        }
    }执行结果:





  • 相关阅读:
    杂谈
    MD语法
    1034 有理数四则运算(20 分)
    1033 旧键盘打字(20 分)
    1032 挖掘机技术哪家强(20 分)
    1031 查验身份证(15 分)
    1030 完美数列(25 分)
    1029 旧键盘(20 分)
    1028 人口普查(20 分)
    1027 打印沙漏(20 分)
  • 原文地址:https://www.cnblogs.com/risuschen/p/13721605.html
Copyright © 2011-2022 走看看