Phaser分析

来源:互联网 发布:环境信息数据字典规范 编辑:程序博客网 时间:2024/05/21 09:08

基本概念

注释:A reusablesynchronization barrier

可重用的同步屏障。英文翻译Phaser['feɪzə]阶段
基本功能:实现多阶段多任务,不同阶段阻塞控制,同一阶段多个任务阻塞控制。

相关机制

  • 注册机制:在任何时刻添加注册,也就是添加注册的state数量,

构造函数中可初始化为state个,可以通过register();执行一次,state+1.

也可以在任务到达同步点,执行arriveAndDeregister(),执行一次state-1.

  • 同步机制,和“一拨任务等另一波任务的CountDownLatch”还有“一拨任务内互等的CyclicBarrier”相似。

包括基本的API

arriveAndAwaitAdvance (),到达屏障,阻塞等待所有任务都到达屏障,arrived计数+1。

arrive(),到达屏障,不阻塞,arrived+1

register(),注册的phase数+1,这个是限制每一个阶段的state数。

arriveAndDeregister,到达屏障,阻塞并等待所有任务都到达屏障,通知注册的phase数-1。

awaitAdvance(int phase),阻塞并等待某个阶段的所有任务都完成。

可复写的方法onAdvance(),该方法有两参数,分别是phase阶段数,registeredParties当前阶段的注册数。每当某个阶段所有任务都到达,这个方法会被唤醒首先调用。

该方法返回boolean值,返回true说明所有任务已终结,可以自己设计终结条件,返回false说明任务haizia

一些get方法获取阶段数,阶段的注册phase数,Tostring方法。

使用结构图


代码例子

分两个阶段;第一个阶段3个任务,第二个阶段3个任务,在main里进行阻塞再进行下一段。
public class MoreTaskMoreStage {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubfinal Phaser phaser = new Phaser(3){@Overrideprotected boolean onAdvance(int phase, int registeredParties) {// TODO Auto-generated method stubSystem.out.println("advance  "+this.toString()); if(phase==0){System.out.println("advance 第一阶段结束 ,isTerminated is false 整个阶段还未结束"); return false;}else if(phase==1){System.out.println("advace 第二阶段结束 ,isTerminated is false 整个阶段已结束"); return true;}else return registeredParties==0;}};for(int i=0;i<3;i++){new Thread(new Task1(i,phaser)).start();try {                  Thread.sleep(1000);              } catch(InterruptedException e) {                  // NOP              } }phaser.awaitAdvance(phaser.getPhase());//main线程一同等待System.out.println("main : 第一阶段阻塞结束");  System.out.println("main  "+phaser.toString()); phaser.register();//第二阶段任务增加了一个,共4个,任务线程3个,main一个for(int i=0;i<3;i++)new Thread(new Task2(i,phaser)).start();while(!phaser.isTerminated()){phaser.arriveAndAwaitAdvance();System.out.println("main :第二阶段结束");  }}public static class Task1 implements Runnable{private final int id;          private final Phaser phaser;          public Task1(int _id,Phaser _phaser){        id=_id;        phaser=_phaser;        }@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("任务1:  starting thread, id: " + id+"  模拟执行2秒,后阻塞等待该阶段全部任务完成");  try {                  Thread.sleep(2000);              } catch(InterruptedException e) {                  // NOP              } phaser.arrive();System.out.println("任务1:  不阻塞");  System.out.println("任务1:  "+phaser.toString()); }}public static class Task2 implements Runnable{private final int id;          private final Phaser phaser;          public Task2(int _id,Phaser _phaser){        id=_id;        phaser=_phaser;        }@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("任务2,    starting thread, id: " + id+"  模拟执行1秒,后阻塞等待该阶段全部任务完成");  try {                  Thread.sleep(1000);              } catch(InterruptedException e) {                  // NOP              } phaser.arriveAndAwaitAdvance();}}}





0 0