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:參加決賽
決賽完成


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM