Phaser

书上的小例子,用婚礼流程比较形象的演示了phaser的使用。

Phaser 是一个类,继承这个类重写onAdvance(int phase, int registeredParties)

参数:两个参数分别是第几个阶段和到达这个阶段的线程数。

返回值:返回ture表示这个phaser结束了,因此只有最后一个阶段返回ture,其他阶段返回false。

phase.bulkRegister(7);//注册总线程数。

{

static MyPhase phase = new MyPhase();

public static void main(String[] args){

// 参数婚礼的总人数为7

phase.bulkRegister(7);

// 5个参加婚礼的客人

for (int i = 0;i<5;i++){

new Thread(new Person("P"+i)).start();

}

// 新郎和新娘

new Thread(new Person("新郎")).start();

new Thread(new Person("新娘")).start();

}

/**

* 参加婚礼的人,含新郎新娘

*/

static class Person implements Runnable{

private String name;

public Person(String name) {

this.name = name;

}

public void arrived() {

try {

TimeUnit.MILLISECONDS.sleep(new Random().nextInt(1000));

System.out.printf("%s is arrived! \n",name);

phase.arriveAndAwaitAdvance();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

public void eat() {

try {

TimeUnit.MILLISECONDS.sleep(new Random().nextInt(1000));

System.out.printf("%s is eated! \n",name);

phase.arriveAndAwaitAdvance();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

public void leave() {

try {

TimeUnit.MILLISECONDS.sleep(new Random().nextInt(1000));

System.out.printf("%s is leave! \n",name);

phase.arriveAndAwaitAdvance();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

public void xx() {

try {

if(name.equals("新郎")|| name.equals("新娘")) {

TimeUnit.MILLISECONDS.sleep(new Random().nextInt(1000));

System.out.printf("%s is xx! \n",name);

phase.arriveAndAwaitAdvance();

}else {

// 客人不参与XX 到达这个阶段就直接撤销。

phase.arriveAndDeregister();

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

@Override

public void run() {

// 每个人需要依次执行到达,吃饭,离席,XX(客人就不要参加了)

arrived();

eat();

leave();

xx();

}

}

static class MyPhase extends Phaser{

@Override

protected boolean onAdvance(int phase, int registeredParties) {

switch (phase){

case 0:{

System.out.println("所有人到齐了,人数为:"+registeredParties);

return false;

}

case 1:{

System.out.println("所有人开始吃饭 !!人数为:"+registeredParties);

return false;

}

case 2:{

System.out.println("所有人吃完了,离席!!!人数为:"+registeredParties);

return false;

}

case 3:{

System.out.println("xx的人数为:"+registeredParties);

return true;

}

default:{

return true;

}

}

}

}

}

测试结果为:

P0 is arrived!

P3 is arrived!

新郎 is arrived!

P1 is arrived!

P4 is arrived!

P2 is arrived!

新娘 is arrived!

所有人到齐了,人数为:7

P1 is eated!

P2 is eated!

P0 is eated!

新郎 is eated!

P4 is eated!

新娘 is eated!

P3 is eated!

所有人开始吃饭 !!人数为:7

P2 is leave!

新娘 is leave!

P0 is leave!

P3 is leave!

P1 is leave!

新郎 is leave!

P4 is leave!

所有人吃完了,离席!!!人数为:7

新娘 is xx!

新郎 is xx!

xx的人数为:2

java phaser,java线程之Phaser相关推荐

  1. java中多线程之CAS(compareAndSet),Unsafe类大白话详解.

    java中多线程之CAS(compareAndSet),Unsafe类大白话详解 什么是CAS CAS原理 Unsafe类:     什么是CAS 比较并交换 在学习CAS之前,我们先了解一下JMM. ...

  2. java unpack_java多线程之park和unpack

    作用 用来创建锁和其他同步类的基本线程阻塞的原语.在查看AbstractQueuedSynchronizer(AQS)中,发现其底层就是使用LockSupport.park()和LockSupport ...

  3. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  4. Java多线程之Callable、Future和FutureTask

    Java多线程之Callable接口 自己想总结一下的,看到一篇总结的更好的博客,就转载了,突然感觉真轻松,哈哈哈哈 文章转载于:Matrix海子:Java并发编程:Callable.Future和F ...

  5. Java多线程之Synchronized和Lock的区别

    Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...

  6. Java多线程之CAS缺点

    Java多线程之CAS缺点 目录: 循环时间开销很大 只能保证一个共享变量的原子操作 引来ABA问题及解决方案(重点) 1. 循环时间开销很大 通过看源码,我们发现有个do while,如果CAS失败 ...

  7. Java多线程之CAS深入解析

    Java多线程之CAS深入解析 目录: CAS是什么 CAS底层原理Unsafe深入解析 CAS缺点 引子:蚂蚁花呗一面:讲一讲AtomicInteger,为什么要用CAS而不是synchronize ...

  8. Java多线程之volatile详解

    Java多线程之volatile详解 目录: 什么是volatile? JMM内存模型之可见性 volatile三大特性之一:保证可见性 volatile三大特性之二:不保证原子性 volatile三 ...

  9. Java多线程之Semaphore用法

    Java多线程之Semaphore用法 本文目录: Semaphore基本概念 Semaphore使用案例:3个停车位,6辆车去抢,走一辆,抢一个停车位. 1. Semaphore基本概念 在信号量上 ...

  10. Java多线程之CyclicBarrier用法

    Java多线程之CyclicBarrier用法 本文目录 CyclicBarrier的基本概念 CyclicBarrier的案例:集齐7颗龙珠就可以召唤神龙 1. CyclicBarrier的基本概念 ...

最新文章

  1. Pytorch翻车记录:单卡改多卡踩坑记!
  2. 用神经网络做分子模型:乙烯和乙炔的实验数据
  3. 互联网公司GitHub repo 语言使用情况
  4. java 文本编辑器 源码_java文本编辑器源码
  5. C# - 类_使用新成员隐藏基类成员
  6. LeetCode 2202. K 次操作后最大化顶端元素
  7. 三种方法生成随机数之GetTickCount篇
  8. python程序输入两个整数、实现加减乘除_加减乘除
  9. 卸载wps后安装office图标异常的问题
  10. ABAP OLE下载到EXCEL
  11. Ran 0 tests in 0.000s
  12. 健身房菜鸟入门小常识
  13. 后端使用postman进行测试
  14. App开发之前的工作准备和开发中的一些流程
  15. 计算机毕业设计ssm基于b_s架构的实习管理系统
  16. 苹果在企业中的应用提升
  17. 东北林业大学计算机教师,我校教师马超感动众网友
  18. 计算机自学知识,计算机基础知识自学
  19. 第5章 8051单片机工作原理
  20. 教育邮箱怎么申请?教育邮箱怎么登录?

热门文章

  1. manjaro搭建java_Manjaro配置JDK
  2. 浅谈目前政企办公协作的需求与痛点
  3. [4G5G专题-90]:流程 - 4G LTE 专用承载建立与Qos业务:QCI、ARP、AMBR、GBR、NON-GBR
  4. 【毕业设计】深度学习 python opencv 实现人脸年龄性别识别
  5. 安装程序包的语言不受系统支持的解决
  6. 取消管理员取得所有权_解决win7系统下管理员取得所有权的技巧
  7. QGIS基本功 | 12 图层的混合模式
  8. 【jqxGrid】jqwidgets.createInstance()方法报错的一种解决方法
  9. SLAM技术课程总结
  10. 计算机组成原理和微机原理实验报告,《计算机组成原理》实验指导.doc