Java线程--Phaser使用
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11867895.html
Java线程--Phaser使用, 代码里头有详细注释:
package concurrent.phaser; import java.util.concurrent.Phaser; /**
* 比赛阶段器
*/
public class GamePhaser extends Phaser { /**
* 当一个阶段的所有线程都到达时 , 执行该方法, 此时 phase自动加1
* @param phase
* @param registeredParties
* @return
*/
@Override
protected boolean onAdvance(int phase, int registeredParties) {
switch (phase) {
case 0 :
System.out.println("预赛完成");
return false;
case 1:
System.out.println("初赛完成");
return false;
case 2:
System.out.println("决赛完成");
return false;
default:
return true;
}
}
}
package concurrent.phaser; import java.util.concurrent.Phaser; /**
* 运动员类
*/
public class Runner implements Runnable { private Phaser phaser; public Runner(Phaser phaser) {
this.phaser = phaser;
} @Override
public void run() {
/**
* 参加预赛
*/
System.out.println("选手-"+Thread.currentThread().getName()+":参加预赛");
/**
* 预赛阶段-----执行这个方法的话会等所有的选手都完成了之后再继续下面的方法
*/
phaser.arriveAndAwaitAdvance();
/**
* 参加初赛
*/
System.out.println("选手-"+Thread.currentThread().getName()+":参加初赛");
/**
* 初赛阶段-----执行这个方法的话会等所有的选手都完成了之后再继续下面的方法
*/
phaser.arriveAndAwaitAdvance();
/**
* 参加决赛
*/
System.out.println("选手-"+Thread.currentThread().getName()+":参加决赛");
/**
* 决赛阶段-----执行这个方法的话会等所有的选手都完成了之后再继续下面的方法
*/
phaser.arriveAndAwaitAdvance();
}
}
package concurrent.phaser; /**
* 比赛开始
*/
public class RunnerGame {
public static void main(String[] args) {
int runnerNum = 4; GamePhaser gamePhaser = new GamePhaser();
/**
* 注册一次表示phaser维护的线程个数
*/
gamePhaser.register();
for (int i = 0; i < runnerNum; i++ ) {
/**
* 注册一次表示phaser维护的线程个数
*/
gamePhaser.register();
new Thread(new Runner(gamePhaser)).start(); }
/**
* 后续阶段主线程就不参加了
*/
gamePhaser.arriveAndDeregister(); }
}
打印如下:
选手-Thread-0:参加预赛
选手-Thread-1:参加预赛
选手-Thread-3:参加预赛
选手-Thread-2:参加预赛
预赛完成
选手-Thread-2:参加初赛
选手-Thread-0:参加初赛
选手-Thread-3:参加初赛
选手-Thread-1:参加初赛
初赛完成
选手-Thread-1:参加决赛
选手-Thread-2:参加决赛
选手-Thread-0:参加决赛
选手-Thread-3:参加决赛
决赛完成
Java线程--Phaser使用的更多相关文章
- Java线程并发:知识点
Java线程并发:知识点 发布:一个对象是使它能够被当前范围之外的代码所引用: 常见形式:将对象的的引用存储到公共静态域:非私有方法中返回引用:发布内部类实例,包含引用. 逃逸:在对象尚未准备 ...
- Java线程的概念
1. 计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...
- Java 线程池框架核心代码分析--转
原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...
- 细说进程五种状态的生老病死——双胞胎兄弟Java线程
java线程的五种状态其实要真正高清,只需要明白计算机操作系统中进程的知识,原理都是相同的. 系统根据PCB结构中的状态值控制进程. 单CPU系统中,任一时刻处于执行状态的进程只有一个. 进程的五种状 ...
- 【转载】 Java线程面试题 Top 50
Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ...
- 第24章 java线程(3)-线程的生命周期
java线程(3)-线程的生命周期 1.两种生命周期流转图 ** 生命周期:**一个事物冲从出生的那一刻开始到最终死亡中间的过程 在事物的漫长的生命周期过程中,总会经历不同的状态(婴儿状态/青少年状态 ...
- 第23章 java线程通信——生产者/消费者模型案例
第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...
- 第22章 java线程(2)-线程同步
java线程(2)-线程同步 本节主要是在前面吃苹果的基础上发现问题,然后提出三种解决方式 1.线程不安全问题 什么叫线程不安全呢 即当多线程并发访问同一个资源对象的时候,可能出现不安全的问题 对于前 ...
- 第21章 java线程(1)-线程初步
java线程(1)-线程初步 1.并行和并发 并行和并发是即相似又有区别: 并行:指两个或者多个事件在同一时刻点发生. 并发:指两个或多个事件在同一时间段内发生 在操作系统中,并发性是指在一段事件内宏 ...
随机推荐
- Java程序设计基础笔记 • 【第8章 方法】
全部章节 >>>> 本章目录 8.1 方法概述 8.1.1 方法的简介 8.1.2 方法的类 8.1.3 自定义方法简介 8.1.3 自定义方法调用 8.1.4 实践练习 ...
- 在 jQuery 中使用滑入滑出动画效果,实现二级下拉导航菜单的显示与隐藏效果
查看本章节 查看作业目录 需求说明: 在 jQuery 中使用滑入滑出动画效果,实现二级下拉导航菜单的显示与隐藏效果 用户将光标移动到"最新动态页"或"帮助查询" ...
- 万能密码:‘or 1=1-- 实战SQL注入,秒破后台
主要是没有对登录密码的字符串进行参数化和过滤,所以导致网站可以直接用"万能密码"进行突破登录 仅供学习交流 这是某同学做的网站,今天无聊打开了,并帮他进行测试一下 看到这个后台,感 ...
- docker学习:dockefile解析
是什么 DockerFile 是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本 构建三部曲 编写Dockerfile文件 docker build docker run 文件什么样 ...
- Java中的对象、类、抽象类、接口的理解
1.对象 对象是个具体的东西,有着明确的属性特征和行为特征. 例如:你手上牵着的女朋友或男朋友就是个具体的对象. 如图中的苏格兰折耳猫,特征是耳朵向下呈折叠状,有着具体的颜色(你看到的颜色),并且和其 ...
- CSS基础 结构伪类选择器 last-child、first-child和nth-of-type的使用方法
一.通过伪类选择器查找单个标签元素html结构 <div> <a herf='#'>导航1</a> <a herf='#'>导航2</a> ...
- element ui 动态菜单解决方案集锦
1.<分享一个VUE Element-UI 的多级菜单动态渲染的组件> 2.<饿了么组件库,element-ui开发精美的后台管理系统系列之(一)开发伸缩菜单> 3.<V ...
- Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401开发
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
- echarts-gl初体验:使用echarts-gl实现3D地球
首先我们要下载引入echarts.js和echarts-gl.js 有需要的自己拿资源哈 链接:https://pan.baidu.com/s/1J7U79ey-2ZN4pjb7RTarjg 提取码: ...
- day23 结构体
(1).若有说明和定义: typedef int *integer: integer p,*q: 则下列叙述正确的是[C] (A).q是基类型位int的指针变量 (B).p是int型变量 (C).p是 ...