Java基本数据类型 Cluster模式 macos api server sdk less用法 change事件 查看kafka消费情况 java创建字符串数组 python报错 python解析json数据 python自学教程 python抛出异常 java基础 javastring类型 java对象序列化 java查看变量类型 wps2011 内存整理工具 蒙文字体 微信摇骰子表情包 python的用途 华为线刷工具 海妖花粉哪里多 maya2008 网络克隆 滑动门代码 tar解压 视频解析软件 暴力猴插件 脚本学习 s10截屏 diskman ipad内存怎么清理 mysql中文乱码 视频旋转软件 chrome访问助手 易语言tv ps平面设计基础教程
当前位置: 首页 > 学习教程  > 编程语言

JUC之Phaser-多线程与高并发

2020/10/8 20:06:06 文章标签:

Phaser支持对于多个线程,阻塞控制统一完成到某个阶段后,再继续进行下一阶段的操作。即所有线程都完成当前阶段后,才可以进入下一阶段进行操作。 以一个婚礼流程为例,比如分为到场、吃饭、离场等流程,必须所有人步调一…

Phaser支持对于多个线程,阻塞控制统一完成到某个阶段后,再继续进行下一阶段的操作。即所有线程都完成当前阶段后,才可以进入下一阶段进行操作。

以一个婚礼流程为例,比如分为到场、吃饭、离场等流程,必须所有人步调一致,人到齐才能开饭。


p0 到达现场!
新娘 到达现场!
p3 到达现场!
p1 到达现场!
p2 到达现场!
新郎 到达现场!
p4 到达现场!
所有人到齐了!7

新娘 吃完!
p2 吃完!
p0 吃完!
p1 吃完!
p3 吃完!
p4 吃完!
新郎 吃完!
所有人吃完了!7

p3 离开!
新郎 离开!
p4 离开!
p1 离开!
p0 离开!
p2 离开!
新娘 离开!
所有人离开了!7

新郎 洞房!
新娘 洞房!
婚礼结束!新郎新娘抱抱!2

Process finished with exit code 0
package basic.aqs.phaser;

import java.util.Random;
import java.util.concurrent.Phaser;
import java.util.concurrent.TimeUnit;

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 到达现场!\n", name);
            phaser.arriveAndAwaitAdvance();
        }

        public void eat() {
            milliSleep(r.nextInt(1000));
            System.out.printf("%s 吃完!\n", name);
            phaser.arriveAndAwaitAdvance();
        }

        public void leave() {
            milliSleep(r.nextInt(1000));
            System.out.printf("%s 离开!\n", name);


            phaser.arriveAndAwaitAdvance();
        }

        private void hug() {
            if(name.equals("新郎") || name.equals("新娘")) {
                milliSleep(r.nextInt(1000));
                System.out.printf("%s 洞房!\n", name);
                phaser.arriveAndAwaitAdvance();
            } else {
                phaser.arriveAndDeregister();
                //phaser.register()
            }
        }

        @Override
        public void run() {
            arrive();


            eat();


            leave();


            hug();

        }
    }
}


 


本文链接: http://www.dtmao.cc/news_show_250186.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?