原创:转载需注明原创地址 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使用的更多相关文章

  1. Java线程并发:知识点

    Java线程并发:知识点   发布:一个对象是使它能够被当前范围之外的代码所引用: 常见形式:将对象的的引用存储到公共静态域:非私有方法中返回引用:发布内部类实例,包含引用.   逃逸:在对象尚未准备 ...

  2. Java线程的概念

    1.      计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...

  3. Java 线程池框架核心代码分析--转

    原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...

  4. 细说进程五种状态的生老病死——双胞胎兄弟Java线程

    java线程的五种状态其实要真正高清,只需要明白计算机操作系统中进程的知识,原理都是相同的. 系统根据PCB结构中的状态值控制进程. 单CPU系统中,任一时刻处于执行状态的进程只有一个. 进程的五种状 ...

  5. 【转载】 Java线程面试题 Top 50

    Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ...

  6. 第24章 java线程(3)-线程的生命周期

    java线程(3)-线程的生命周期 1.两种生命周期流转图 ** 生命周期:**一个事物冲从出生的那一刻开始到最终死亡中间的过程 在事物的漫长的生命周期过程中,总会经历不同的状态(婴儿状态/青少年状态 ...

  7. 第23章 java线程通信——生产者/消费者模型案例

    第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...

  8. 第22章 java线程(2)-线程同步

    java线程(2)-线程同步 本节主要是在前面吃苹果的基础上发现问题,然后提出三种解决方式 1.线程不安全问题 什么叫线程不安全呢 即当多线程并发访问同一个资源对象的时候,可能出现不安全的问题 对于前 ...

  9. 第21章 java线程(1)-线程初步

    java线程(1)-线程初步 1.并行和并发 并行和并发是即相似又有区别: 并行:指两个或者多个事件在同一时刻点发生. 并发:指两个或多个事件在同一时间段内发生 在操作系统中,并发性是指在一段事件内宏 ...

随机推荐

  1. ECMA-262规范定义的七种错误类型

    第一种:Error    所有错误的基本类型,实际上不会被抛出.   第二种:EvalError   执行eval错误时抛出. 第三种:ReferenceError    对象不存在是抛出. 第四种: ...

  2. windows环境下node安装教程(超详细)

    安装node.js 1.下载node: 下载地址:http://nodejs.cn/download/ node.js的zip包安装时是直接解压缩后就可以了, node.js的msi包是傻瓜式一路ne ...

  3. Solr集群安装Version5.5.2(cloud模式)

    Solr安装cloud模式,基于Solr的安装版本为5.5.2. 安装规划 Solr IP/机器名 安装软件 运行进程 zdh-7 solr jar zdh-9 solr jar zookeeper ...

  4. CSS基础-5 伪类

    一.伪类 我们以a标签为例 伪类标签分为4类     1. 设置超链接默认的样式 a:link {属性:值;.....} 或者 a { 属性: 值;}           推荐使用这种方式     2 ...

  5. MySQL约束和数据类型

    约束条件 约束条件就是在给字段加一些约束,使该字段存储的值更加符合我们的预期. 常用约束条件如下: UNSIGNED :无符号,值从0开始,无负数 ZEROFILL:零填充,当数据的显示长度不够的时候 ...

  6. iview获取全选和半选数据(方法一:基于树型数据)

    在用iview的时候发现iview的树中获取半选和全选的函数getCheckedAndIndeterminateNodes在我使用的iview版本里面是没有提供的, 于是自己写了一下获取全选和半选节点 ...

  7. 动静分离、Rewirte、HTTPS

    目录 Nginx动静分离技术 示例搭建步骤 部署NFS 静态资源共享 部署代理服务器 Rewrite(重点) Rewrite基本概述 rewrite语法 rewrite标记Flag last和brea ...

  8. BitMap算法知识笔记以及在大数据方向的使用

    概述 所谓的BitMap算法就是位图算法,简单说就是用一个bit位来标记某个元素所对应的value,而key即是该元素,由于BitMap使用了bit位来存储数据,因此可以大大节省存储空间,这是很常用的 ...

  9. 基于Jenkins+Maven+Gitea+Nexus从0到1搭建CICD环境

    在传统的单体软件架构中,软件开发.测试.运维都是以单个进程为单位. 当拆分成微服务之后,单个应用可以被拆分成多个微服务,比如用户系统,可以拆分成基本信息管理.积分管理.订单管理.用户信息管理.合同管理 ...

  10. JDK8 一文搞定👍

    ! https://zhuanlan.zhihu.com/p/442182870 Java8 新特性 学习来源于 B站 尚硅谷yyds Java学习源码 2021/11/22 距离,过年还有 57 天 ...