线程辅助类(五)--Phaser

Phaser是一类线程辅助类,这里介绍它的主要功能,它可用于在多个线程间,

在执行过程多个点的每个点进行同步,同时在每个同步点还可执行自定义操作。

一、关键点如下:

1、new Phaser(n)

定义n个需同步的线程,当然也可以线程提交运行前使用phaser.register()进行注册;

2、重写Phase的boolean onAdvance(int phase, int registeredParties)方法  (若无需要可以不重写,忽略该步)

里面可自定义每个同步点的处理,注意返回值,true表示phase应该结束,false表示不结束

3、phaser.arriveAndAwaitAdvance()

这是在每个执行线程中,当到每达同步点时,调用。此时执行线程会等待其它线程,都到齐后才会接着执行后面的操作

4、phaser.arriveAndDeregister()

这是在每个执行线程中,当线程执行结束时,调用,表示操作执行结束,不再需要同步,取消phaser的注册

5、phaser.isTerminated()

主线程检测各线程是否已经执行完成,或者说是phaser生命周期已结束,各阶段已经完成

二、实例代码如下:

public class PhaserMain {

    public static void main(String[] args) throws InterruptedException {
        Phaser phaser = new Phaser(3){
            protected boolean onAdvance(int phase, int registeredParties) {
                System.out.println(Thread.currentThread().getName()+ " phase "+ phase+" ;  registerParties  "+registeredParties);
                return registeredParties == 0;
            }
        };
        System.out.println(Thread.currentThread().getName()+ "  game start");
        ExecutorService es = Executors.newCachedThreadPool();
        for(int i=0;i<3;i++){
            es.submit(new Runner(phaser));
        }
        while(!phaser.isTerminated()){
            TimeUnit.MILLISECONDS.sleep(10);
        }
        System.out.println(Thread.currentThread().getName()+ "  game over");

        es.shutdown();
    }

    static class Runner implements Callable{

        private Phaser phaser;

        public Runner(Phaser phaser) {
            this.phaser = phaser;
        }

        @Override
        public final String call() throws Exception {
            phaser.arriveAndAwaitAdvance();
            System.out.println(Thread.currentThread().getName()+" run 1");
            phaser.arriveAndAwaitAdvance();
            System.out.println(Thread.currentThread().getName()+" run 2");
            phaser.arriveAndAwaitAdvance();
            System.out.println(Thread.currentThread().getName()+" run 3");
            phaser.arriveAndDeregister();
            return null;
        }
    }
}

执行结果如下:

main  game start
pool-1-thread-3 phase 0 ;  registerParties  3
pool-1-thread-3 run 1
pool-1-thread-2 run 1
pool-1-thread-1 run 1
pool-1-thread-1 phase 1 ;  registerParties  3
pool-1-thread-3 run 2
pool-1-thread-2 run 2
pool-1-thread-1 run 2
pool-1-thread-1 phase 2 ;  registerParties  3
pool-1-thread-2 run 3
pool-1-thread-3 run 3
pool-1-thread-1 run 3
pool-1-thread-1 phase 3 ;  registerParties  0
main  game over





你可能感兴趣的:(java多线程)