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:参加决赛
    决赛完成
  • 相关阅读:
    【2014 Multi-University Training Contest 3 1002】/【HDU 4888】 Redraw Beautiful Drawings
    8 shell命令之find
    [网络]_[0基础]_[使用putty备份远程数据]
    Cstyle的UEFI导读:第20.0篇 IGD OpRegion interface &amp;&amp; IGD OpRegion PROTOCOL
    Mac下使用MySQL
    Qt中截图功能的实现
    gdb经常使用命令总结
    Graphical Shell with WebShell
    SSH WebShell: SSH在线WEB管理器安装教程
    python—webshell_醉清风xf_新浪博客
  • 原文地址:https://www.cnblogs.com/fanerwei222/p/11867895.html
Copyright © 2011-2022 走看看