zoukankan      html  css  js  c++  java
  • 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:参加决赛
    决赛完成
  • 相关阅读:
    4种方法教你如何截取JS字符串最后一位
    12种JS常用获取时间的方式
    拖动的模态框
    计算鼠标在盒子内的坐标
    offset与style的区别
    offset系列属性
    Words
    #一些真相# 和自己握手言和,不要期盼另一片荒岛可以让你变成陆地
    Stack为什么翻译成栈?- 根据字形来辨别容易混淆的堆和栈
    [Hardware] 机械硬盘和固态硬盘功耗对比
  • 原文地址:https://www.cnblogs.com/fanerwei222/p/11867895.html
Copyright © 2011-2022 走看看