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();
    
            }
        }
    }执行结果:





  • 相关阅读:
    基于ExtAspNet的开源项目 Ext4JSLint
    ExtAspNet应用技巧(九) Grid导出为Excel文件
    ExtAspNet应用技巧(十二) 系统登录
    ExtAspNet v2.0.7
    原来最可怕的不是工作,是无聊
    获取Word文档的作者和主题
    《可变范围规约》
    用IronPython加载,写入文本文件
    IronPython中没有System.Data命名空间?
    《敏捷建模》读后感
  • 原文地址:https://www.cnblogs.com/risuschen/p/13721605.html
Copyright © 2011-2022 走看看