java phaser,java线程之Phaser
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相关推荐
- java中多线程之CAS(compareAndSet),Unsafe类大白话详解.
java中多线程之CAS(compareAndSet),Unsafe类大白话详解 什么是CAS CAS原理 Unsafe类: 什么是CAS 比较并交换 在学习CAS之前,我们先了解一下JMM. ...
- java unpack_java多线程之park和unpack
作用 用来创建锁和其他同步类的基本线程阻塞的原语.在查看AbstractQueuedSynchronizer(AQS)中,发现其底层就是使用LockSupport.park()和LockSupport ...
- JAVA多线程之wait/notify
本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...
- Java多线程之Callable、Future和FutureTask
Java多线程之Callable接口 自己想总结一下的,看到一篇总结的更好的博客,就转载了,突然感觉真轻松,哈哈哈哈 文章转载于:Matrix海子:Java并发编程:Callable.Future和F ...
- Java多线程之Synchronized和Lock的区别
Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...
- Java多线程之CAS缺点
Java多线程之CAS缺点 目录: 循环时间开销很大 只能保证一个共享变量的原子操作 引来ABA问题及解决方案(重点) 1. 循环时间开销很大 通过看源码,我们发现有个do while,如果CAS失败 ...
- Java多线程之CAS深入解析
Java多线程之CAS深入解析 目录: CAS是什么 CAS底层原理Unsafe深入解析 CAS缺点 引子:蚂蚁花呗一面:讲一讲AtomicInteger,为什么要用CAS而不是synchronize ...
- Java多线程之volatile详解
Java多线程之volatile详解 目录: 什么是volatile? JMM内存模型之可见性 volatile三大特性之一:保证可见性 volatile三大特性之二:不保证原子性 volatile三 ...
- Java多线程之Semaphore用法
Java多线程之Semaphore用法 本文目录: Semaphore基本概念 Semaphore使用案例:3个停车位,6辆车去抢,走一辆,抢一个停车位. 1. Semaphore基本概念 在信号量上 ...
- Java多线程之CyclicBarrier用法
Java多线程之CyclicBarrier用法 本文目录 CyclicBarrier的基本概念 CyclicBarrier的案例:集齐7颗龙珠就可以召唤神龙 1. CyclicBarrier的基本概念 ...
最新文章
- Pytorch翻车记录:单卡改多卡踩坑记!
- 用神经网络做分子模型:乙烯和乙炔的实验数据
- 互联网公司GitHub repo 语言使用情况
- java 文本编辑器 源码_java文本编辑器源码
- C# - 类_使用新成员隐藏基类成员
- LeetCode 2202. K 次操作后最大化顶端元素
- 三种方法生成随机数之GetTickCount篇
- python程序输入两个整数、实现加减乘除_加减乘除
- 卸载wps后安装office图标异常的问题
- ABAP OLE下载到EXCEL
- Ran 0 tests in 0.000s
- 健身房菜鸟入门小常识
- 后端使用postman进行测试
- App开发之前的工作准备和开发中的一些流程
- 计算机毕业设计ssm基于b_s架构的实习管理系统
- 苹果在企业中的应用提升
- 东北林业大学计算机教师,我校教师马超感动众网友
- 计算机自学知识,计算机基础知识自学
- 第5章 8051单片机工作原理
- 教育邮箱怎么申请?教育邮箱怎么登录?
热门文章
- manjaro搭建java_Manjaro配置JDK
- 浅谈目前政企办公协作的需求与痛点
- [4G5G专题-90]:流程 - 4G LTE 专用承载建立与Qos业务:QCI、ARP、AMBR、GBR、NON-GBR
- 【毕业设计】深度学习 python opencv 实现人脸年龄性别识别
- 安装程序包的语言不受系统支持的解决
- 取消管理员取得所有权_解决win7系统下管理员取得所有权的技巧
- QGIS基本功 | 12 图层的混合模式
- 【jqxGrid】jqwidgets.createInstance()方法报错的一种解决方法
- SLAM技术课程总结
- 计算机组成原理和微机原理实验报告,《计算机组成原理》实验指导.doc