Phaser的使用

package com.example.sina.thread;

import java.util.concurrent.Phaser;

public class PhaserTest {
    
    public static void main(String[] args) throws InterruptedException {
        Phaser phaser = new Phaser();
        PhaserWorker[] phaserWorkers = new PhaserWorker[5];
        for (int i = 0; i < phaserWorkers.length; i++) {
            phaser.register();
            phaserWorkers[i] = new PhaserWorker(phaser);
            new Thread(new PhaserWorker(phaser)).start();
        }
    }
    static class PhaserWorker implements Runnable {
        private final Phaser phaser;
        public PhaserWorker(Phaser phaser) {
            this.phaser = phaser;
        }
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + " | 到達" );
            phaser.arriveAndAwaitAdvance(); // 集合完畢發車
            try {
                Thread.sleep(1000);
                System.out.println(Thread.currentThread().getName() + " | 到達" );
                phaser.arriveAndAwaitAdvance(); // 景點 1 集合完畢發車
                Thread.sleep(1000);
                System.out.println(Thread.currentThread().getName() + " | 到達" );
                phaser.arriveAndAwaitAdvance(); // 景點 2 集合完畢發車
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    // Phaser 每個階段完成之後的事件通知
    
    static class MyPhaser extends Phaser {

        @Override
        protected boolean onAdvance(int phase, int registeredParties) {
            // 每個階段執行完之後的回調
            switch (phase) {
            case 0:
                System.out.println("==== 集合完畢發車 ====");
                return false;
            case 1:
                System.out.println("==== 景點1集合完畢,發車去下一個景點 ====");
                return false;
            case 2:
                System.out.println("==== 景點2集合完畢,發車回家 ====");
                return false;
            default:
                return true;
            }
        }
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章