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:参加决赛
决赛完成
原文地址:https://www.cnblogs.com/fanerwei222/p/11867895.html