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
- Phaser分析
- 源码分析-Phaser
- Phaser
- Phaser
- Phaser
- phaser
- java.util.concurrent中Phaser的分析
- Class Phaser
- java Phaser
- phaser入门教程
- Phaser入门教程
- phaser入门教程
- phaser随记
- Phaser.js 官方中文文档 phaser.io
- Java线程之Phaser
- jdk7的Phaser
- Java线程:Phaser
- Phaser实现源码剖析
- 【狄克特斯拉算法验证】
- Android关于ListView中item与控件抢夺焦点的那些事
- Leetcode 2. Add Two Numbers
- JPEG压缩算法
- 如何在AWS上运行Kubernetes
- Phaser分析
- Apache Mina框架UDP测试案例--->java
- OpenGL的基础光照和计算
- android屏幕适配csdn
- hadoop启动失败
- 初识Matlab遗传算法工具箱 ga
- 如何在图像上指定位置生成填充的圆形图案
- Redis从文件中批量执行命令
- Github上的常用特效