phaser java_【Java并发编程实战】-----“J.U.C”:Phaser

Phaser由java7中推出,是Java SE 7中新增的一个使用同步工具,在功能上面它与CyclicBarrier、CountDownLatch有些重叠,但是它提供了更加灵活、强大的用法。

CyclicBarrier,允许一组线程互相等待,直到到达某个公共屏障点。它提供的await()可以实现让所有参与者在临界点到来之前一直处于等待状态。

CountDownLatch,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。它提供了await()、countDown()两个方法来进行操作。

在Phaser中,它把多个线程协作执行的任务划分为多个阶段,编程时需要明确各个阶段的任务,每个阶段都可以有任意个参与者,线程都可以随时注册并参与到某个阶段。

构造

Phaser创建后,初始阶段编号为0,构造函数中指定初始参与个数。

注册:Registration

Phaser支持通过register()和bulkRegister(int parties)方法来动态调整注册任务的数量。

Arrival

每个Phaser实例都会维护一个phase number,初始值为0。每当所有注册的任务都到达Phaser时,phase number累加,并在超过Integer.MAX_VALUE后清零。arrive()和arriveAndDeregister()方法用于记录到达;其中arrive(),某个参与者完成任务后调用;arriveAndDeregister(),任务完成,取消自己的注册。arriveAndAwaitAdvance(),自己完成等待其他参与者完成,进入阻塞,直到Phaser成功进入下个阶段。

example 1

public classPhaserTest_1 {public static voidmain(String[] args) {

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

Task_01 task_01= newTask_01(phaser);

Thread thread= new Thread(task_01, "PhaseTest_" +i);

thread.start();

}

}static class Task_01 implementsRunnable{private finalPhaser phaser;publicTask_01(Phaser phaser){this.phaser =phaser;

}

@Overridepublic voidrun() {

System.out.println(Thread.currentThread().getName()+ "执行任务完成,等待其他任务执行......");//等待其他任务执行完成

phaser.arriveAndAwaitAdvance();

System.out.println(Thread.currentThread().getName()+ "继续执行任务...");

}

}

}

运行结果:

PhaseTest_0执行任务完成,等待其他任务执行......

PhaseTest_1执行任务完成,等待其他任务执行......

PhaseTest_3执行任务完成,等待其他任务执行......

PhaseTest_2执行任务完成,等待其他任务执行......

PhaseTest_4执行任务完成,等待其他任务执行......

PhaseTest_4继续执行任务...

PhaseTest_1继续执行任务...

PhaseTest_0继续执行任务...

PhaseTest_2继续执行任务...

PhaseTest_3继续执行任务...

在该实例中我们可以确认,所有子线程的****+”继续执行任务…”,都是在线程调用arriveAndAwaitAdvance()方法之后执行的。

example 2

前面提到过,Phaser提供了比CountDownLatch、CyclicBarrier更加强大、灵活的功能,从某种程度上来说,Phaser可以替换他们:

public classPhaserTest_5 {public static voidmain(String[] args) {

Phaser phaser= new Phaser(1); //相当于CountDownLatch(1)//五个子任务

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

Task_05 task= newTask_05(phaser);

Thread thread= new Thread(task,"PhaseTest_" +i);

thread.start();

}try{//等待3秒

Thread.sleep(3000);

}catch(InterruptedException e) {

e.printStackTrace();

}

phaser.arrive();//countDownLatch.countDown()

}static class Task_05 implementsRunnable{private finalPhaser phaser;

Task_05(Phaser phaser){this.phaser =phaser;

}

@Overridepublic voidrun() {

phaser.awaitAdvance(phaser.getPhase());//countDownLatch.await()

System.out.println(Thread.currentThread().getName() + "执行任务...");

}

}

}

在这里,任务一开始并没有真正执行,而是等待三秒后执行。

对于CyclicBarrier就更加简单了,直接arriveAndAwaitAdvance()方法替换,如example 1。

example 3

在CyclicBarrier中当任务执行完之后可以执行一个action,在Phaser中同样有一个对应的action,只不过Phaser需要重写onAdvance()方法:

public classPhaserTest_3 {public static voidmain(String[] args) {

Phaser phaser= new Phaser(3){/*** registeredParties:线程注册的数量

* phase:进入该方法的线程数,*/

protected boolean onAdvance(int phase, intregisteredParties) {

System.out.println("执行onAdvance方法.....;phase:" + phase + "registeredParties=" +registeredParties);return phase == 3;

}

};for(int i = 0 ; i < 3 ; i++){

Task_03 task= newTask_03(phaser);

Thread thread= new Thread(task,"task_" +i);

thread.start();

}while(!phaser.isTerminated()){

phaser.arriveAndAwaitAdvance();//主线程一直等待

}

System.out.println("主线程任务已经结束....");

}static class Task_03 implementsRunnable{private finalPhaser phaser;publicTask_03(Phaser phaser){this.phaser =phaser;

}

@Overridepublic voidrun() {do{try{

Thread.sleep(500);

}catch(InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+ "开始执行任务...");

phaser.arriveAndAwaitAdvance();

}while(!phaser.isTerminated());

}

}

}

运行结果:

task_0开始执行任务...

task_1开始执行任务...

task_1执行onAdvance方法.....;phase:0registeredParties=3task_2开始执行任务...

task_0开始执行任务...

task_1开始执行任务...

task_0执行onAdvance方法.....;phase:1registeredParties=3task_2开始执行任务...

task_2执行onAdvance方法.....;phase:2registeredParties=3主线程任务已经结束....

task_0开始执行任务...

参考博文:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 时间类 joda_Java日期类Joda-time的使用及性能对比

在产品的性能优化过程中发现JDK的日期类Calendar使用起来太慢&#xff0c;于是找了替代方案&#xff0c;惊喜的发现Joda-time类库&#xff0c;提供的API功能丰富&#xff0c;关键的是性能要比JDK的Calendar要高出许多。1)日期的实例化//构造方法有很多,对比Calendar类&#xff…

spark sql hbase java_Spark 读写 HBase 的两种方式(RDD、DataFrame)

使用 saveAsHadoopDataset 写入数据import org.apache.hadoop.hbase.{HBaseConfiguration, HTableDescriptor, TableName}import org.apache.hadoop.hbase.client.{HBaseAdmin, Put, Result}import org.apache.hadoop.hbase.io.ImmutableBytesWritableimport org.apache.hadoop…

java 双重检查锁 有序_Java中的双重检查锁(double checked locking)

1 public classSingleton {2 private staticSingleton uniqueSingleton;34 privateSingleton() {5 }67 publicSingleton getInstance() {8 if (null uniqueSingleton) {9 uniqueSingleton newSingleton();10 }11 returnuniqueSingleton;12 }13 }在多线程的情况下&#xff0c;这…

centos 7 nginx hhvm mysql_CentOS 7 编译安装 HHVM 3.4.1

博客彻底迁移到了DigitalOcean上&#xff0c;无奈囊中羞涩&#xff0c;只能开个512MB内存的Droplet。。。只不过&#xff0c;小内存也可以玩出花样。之前就一直想尝试用一下HHVM&#xff0c;无奈编译实在是太麻烦&#xff0c;一直偷懒没使用。这篇文章就用来记录期间编译安装的…

java 耦合度_Java第三十八天,Spring框架系列,使用工厂模式降低程序耦合度

一、什么是耦合程序之间的依赖关系&#xff1a;①类之间的依赖②方法之间的依赖注意&#xff1a;不可能完全的消除依赖关系&#xff0c;而只能是降低程序之间的依赖关系二、解耦降低程序之间的依赖关系&#xff1a;1.解决类之间的依赖关系&#xff1a;①通过读取配置文件来获取…

Java 实现sha_Java实现SHA算法的方法详解

本文实例讲述了Java实现SHA算法的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;一 简介安全散列算法固定长度摘要信息二 SHA算法SHA-1、SHA-2(SHA-224、SHA-256、SHA384、SHA-512)三 SHA算法实现package com.imooc.security.sha;import java.security.MessageDi…

jsp和java使用值_如何将表单的值从jsp发送到Java

我有一个包含30个不同字段的表格。将它们全部传递给控制器​​时&#xff0c;需要为每个属性都具有一个属性&#xff0c;以及一对getter&#xff0c;setter。我将使表单字段作为一个对象并将该对象发送到控制器。我正在使用以下代码 &#xff0c; 但有人建议从jsp调用java方法并…

linux mysql 脚本带参数_Linux下用SHELL脚本执行带输入输出参数的ORACLE存储过程并得到结果...

存储过程 myproc(in_num in number,out_num out number)sql脚本模板mysql.sql{var nret number;execute :nret : 0;--初始化call存储过程 myproc(in_num in number,out_num out number)sql脚本模板mysql.sql{var nret number;execute :nret : 0;--初始化call myproc(in_code,:n…

mysql 半同步 配置_Mysql 半同步复制配置

以下是配置和监控半同步复制&#xff1a;1. 半同步复制功能以plugin的方式接入MySQL&#xff0c;需要在主库与从库两端同时开启半同步的支持&#xff0c;具体配置如下&#xff1a;On the mastermysql> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;m…

java 窗口线程_Java 窗体与线程问题

展开全部主窗口线程不能阻塞&#xff0c;也就是说应该处于空闲状态。如果阻62616964757a686964616fe4b893e5b19e31333335333638塞&#xff0c;窗口将不能响应用户事件。程序应该类似于这样public class ServerFrame extends JFrame {public ServerFrame() {//设置其他窗口参数/…

MySQL自动建立集合自动分片_1.mongodb初步使用总结

mongoDB2.6使用总结一、准备工作下载java驱动包驱动包下载地址&#xff1a;http://www.doczj.com/doc/3305bc20960590c69ec376c0.html/artifact/org.mongodb/mongo-java-driver mongoDB下载&#xff1a;http://www.doczj.com/doc/3305bc20960590c69ec376c0.html/在线api&#x…

java response.write_@ResponseBody与response.getWriter .write()区别

responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后&#xff0c;写入到response对象的body区&#xff0c;通常用来返回JSON数据或者是XML数据&#xff0c;需要注意的呢&#xff0c;在使用此注解之后不会再走视图处理器&#xff0c;而是…

springcloud 创建子父项目_idea搭建springCloud----搭建父子项目(二)

今天介绍一下 : idea 搭建父子项目父项目&#xff1a;springCloud_ht子项目&#xff1a;eureka_server(注册中心)1-1.新建父项目&#xff1a;1-2 起名称 springCloud_ht1-3 什么都不选&#xff0c;next1-4 :起项目名称:springCloud_ht1-5: 该目录为下图&#xff0c;但是项目为红…

db2 mysql sql server_连接数据库的方法(Oracle DB2 SQL Server MySQL...)

[java]代码库import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;/*** 连接各类数据库的方法*/public class DBConnector {/*** 获得数据库连接** param driverClassName* 连接数据库用到的驱动类的类名* param dbURL* 数据库的URL* para…

格子里输出 java_蓝桥杯-格子中输出-java

/* (程序头部注释开始)* 程序的版权和版本声明部分* Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生* All rights reserved.* 文件名称&#xff1a; 蓝桥杯赛题* 作 者&#xff1a; 彭俊豪* 完成日期&#xff1a; 2016 年 04月 01日* 版 本 号&#xff1a; …

基于java的rsa加密程序_RSA rsa加密程序,rsa java源码和 rsa的jsp Crypt_De algrithms 解密 238万源代码下载- www.pudn.com...

文件名称: RSA下载收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 169 KB上传时间: 2014-04-23下载次数: 0提 供 者: 姚双奇详细说明&#xff1a;rsa加密程序&#xff0c;rsa java源码和 rsa的jsp-rsa encryption program, rsa java source code and rsa in jsp文件列表(点击…

java jdbc is一个会话_java_JdbcUtilis_单实例

//eg1,没有使用单实例&#xff0c;eg2有package cn.itcast;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public final class JdbcUtils {private static String url "…

蝗虫算法java代码_蝗虫搜索算法 蝗虫算法:蝗虫优化算法是模拟自然界蝗虫种群捕食行为而提出的一 联合开发网 - pudn.com...

蝗虫搜索算法所属分类&#xff1a;其他开发工具&#xff1a;matlab文件大小&#xff1a;347KB下载次数&#xff1a;5上传日期&#xff1a;2020-07-26 16:31:25上 传 者&#xff1a;西柚不加冰说明&#xff1a; 蝗虫算法&#xff1a;蝗虫优化算法是模拟自然界蝗虫种群捕食行为而…

mysql 唯一约束 多字段_mysql多字段唯一约束

MySQL唯一约束(Unique Key)要求该列唯一&#xff0c;允许为空&#xff0c;但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。在创建表时设置唯一约束在定义完列之后直接使用 UNIQUE 关键字指定唯一约束&#xff0c;语法规则如下&#xff1a; UNIQUE创建数据表 t…

java中final是修饰符么_Java final修饰符详解

final 在 Java 中的意思是最终&#xff0c;也可以称为完结器&#xff0c;表示对象是最终形态的&#xff0c;不可改变的意思。final 应用于类、方法和变量时意义是不同的&#xff0c;但本质是一样的&#xff0c;都表示不可改变。使用 final 关键字声明类、变量和方法需要注意以下…