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.并行和并发 并行和并发是即相似又有区别: 并行:指两个或者多个事件在同一时刻点发生. 并发:指两个或多个事件在同一时间段内发生 在操作系统中,并发性是指在一段事件内宏 ...
随机推荐
- RESTful测试工具RESTClient
1.简介 RESTClient是一个用于测试RESTful Web服务的客户端, 是用Java Swing编写的基于Http协议的接口测试工具, 它可以向服务器发送各种Http请求,并显示服务器响应. ...
- 高可用k8s集群搭建
虚拟机选择 Win10 Hyper-V 总体架构 三个master,三个node master的组件 etcd kube-apiserver kube-controller-manager kube- ...
- nano 编辑器快速入门
# 打开或新建一个文件 $ nano tmp.txt # 常用组合按键 ^G:获取帮助 ^X:退出,如果文件有改定会提示是否保存 ^O:保存文件内容 ^R:读取其他文件的内容,放入到当前文件中 ^W: ...
- 简单通俗讲解 android 内存泄漏
在柠檬班社区看到老师一篇android 内存泄漏写的通俗易懂,绝对是小白能看懂的! 原文:http://www.lemfix.com/topics/2 平常会听到程序员说"内存泄漏" ...
- linux修改默认的SSH远程端口22
1.编辑sshd_config文件 [root@localhost ~]# vim /etc/ssh/sshd_config 搜索 #Port 22行,删除开头的 # 字符,然后将其替换为要使用的端 ...
- Git 的配置 config
Git 的配置 config Git 的配置 config config 文件简述 config 文件位置 信息查询 修改 config 文件 编辑配置文件 增加指定配置项 删除指定配置项 自助餐 ...
- scanf报错问题
VS2013 scanf()函数报错问题. 编译器就是说这个环境下用scanf()函数不安全,建议使用scanf_s()函数.如何要使用scanf()函数的话,就需要在头文件或者源文件开头加上:use ...
- Go环境配置和GoModule
Linux相关 Linux常用操作 mkdir directory --创建文件夹 vi file --创建文件,再关闭vim rm file --删除文件 rm -rf directory --递归 ...
- C# 基本控件使用练习
自己设计并编写一个 Windows 应用程序,要求用到 TextBox.GroupBox.RadioButton.CheckBox.ComboBox.ListBox 控件. 代码如下: 页面1: us ...
- 【刷题-LeetCode】215. Kth Largest Element in an Array
Kth Largest Element in an Array Find the kth largest element in an unsorted array. Note that it is t ...