• Java线程--Phaser使用


    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11867895.html

    Java线程--Phaser使用, 代码里头有详细注释:

    package concurrent.phaser;
    
    import java.util.concurrent.Phaser;
    
    /**
     * 比赛阶段器
     */
    public class GamePhaser extends Phaser {
    
        /**
         * 当一个阶段的所有线程都到达时 , 执行该方法, 此时 phase自动加1
         * @param phase
         * @param registeredParties
         * @return
         */
        @Override
        protected boolean onAdvance(int phase, int registeredParties) {
            switch (phase) {
                case 0 :
                    System.out.println("预赛完成");
                    return false;
                case 1:
                    System.out.println("初赛完成");
                    return false;
                case 2:
                    System.out.println("决赛完成");
                    return false;
                default:
                    return true;
            }
        }
    }
    package concurrent.phaser;
    
    import java.util.concurrent.Phaser;
    
    /**
     * 运动员类
     */
    public class Runner implements Runnable {
    
        private Phaser phaser;
    
        public Runner(Phaser phaser) {
            this.phaser = phaser;
        }
    
        @Override
        public void run() {
            /**
             * 参加预赛
             */
            System.out.println("选手-"+Thread.currentThread().getName()+":参加预赛");
            /**
             * 预赛阶段-----执行这个方法的话会等所有的选手都完成了之后再继续下面的方法
             */
            phaser.arriveAndAwaitAdvance();
            /**
             * 参加初赛
             */
            System.out.println("选手-"+Thread.currentThread().getName()+":参加初赛");
            /**
             * 初赛阶段-----执行这个方法的话会等所有的选手都完成了之后再继续下面的方法
             */
            phaser.arriveAndAwaitAdvance();
            /**
             * 参加决赛
             */
            System.out.println("选手-"+Thread.currentThread().getName()+":参加决赛");
            /**
             * 决赛阶段-----执行这个方法的话会等所有的选手都完成了之后再继续下面的方法
             */
            phaser.arriveAndAwaitAdvance();
        }
    }
    package concurrent.phaser;
    
    /**
     * 比赛开始
     */
    public class RunnerGame {
        public static void main(String[] args) {
            int runnerNum = 4;
    
            GamePhaser gamePhaser = new GamePhaser();
            /**
             * 注册一次表示phaser维护的线程个数
             */
            gamePhaser.register();
            for (int i = 0; i < runnerNum;  i++ ) {
                /**
                 * 注册一次表示phaser维护的线程个数
                 */
                gamePhaser.register();
                new Thread(new Runner(gamePhaser)).start();
    
            }
            /**
             * 后续阶段主线程就不参加了
             */
            gamePhaser.arriveAndDeregister();
    
        }
    }

    打印如下:

    选手-Thread-0:参加预赛
    选手-Thread-1:参加预赛
    选手-Thread-3:参加预赛
    选手-Thread-2:参加预赛
    预赛完成
    选手-Thread-2:参加初赛
    选手-Thread-0:参加初赛
    选手-Thread-3:参加初赛
    选手-Thread-1:参加初赛
    初赛完成
    选手-Thread-1:参加决赛
    选手-Thread-2:参加决赛
    选手-Thread-0:参加决赛
    选手-Thread-3:参加决赛
    决赛完成
  • 相关阅读:
    thinkphp3.2 无法加载模块
    php 使用 wangeditor3 图片上传
    nginx 配置 server
    oracle练手(一)
    Oracle练习(一)
    java运算符优先级
    数据库(mysql和oracle)
    java实现4种内部排序
    mysql-----分库分表
    NIO总结-----Buffer
  • 原文地址:https://www.cnblogs.com/fanerwei222/p/11867895.html
Copyright © 2020-2023  润新知