多线程-并发:介绍Phaser

2024-01-07 00:30
文章标签 介绍 并发 多线程 phaser

本文主要是介绍多线程-并发:介绍Phaser,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

接上一篇。多线程-并发:介绍CyclicBarrier

我们继续聊《天龙八部》四大恶人。

大家都知道,叶二娘是虚竹的娘,少室山一战玄慈方丈和叶二娘都领了便当。从此四大恶人就剩了三个。

大家也都知道,小说接近尾声,段誉身份解开前后,岳老三被段延庆捅了个透心凉领了便当;云中鹤因为中了悲酥清风,被前来救援的大理臣子收了人头。从此四大恶人就剩了一个。

当我们纵观整个四大恶人(四个线程),发现他们:

①多阶段协同,但阶段的参与数可变!因此在使用CyclicBarrier不好实现了。

②假定第一阶段4个,第二阶段3个,第三阶段1个。

这时,就需要我们有新的编程利器:Phaser(阶段协同器,也被称为相位器)

简介:

java7中增加的用于多阶段同步控制的工具类,它包含了CyclicBarrier和CountDownLatch的相关功能,比他们更加强大灵活。

多个线程写作执行的任务分为多个阶段,每个阶段都可以有任意个参与者,线程可以随时注册并参与到某个阶段;当一个阶段中所有的任务都被完成成功之后,Phaser的OnAdvance()被调用(类似循环屏障的使用的Runnable接口,可以通过覆盖添加自定义处理逻辑),然后Phaser释放等待线程,自动进入下个阶段。如此循环,直到Phaser不再包含任何参与者。

//注意!
//单个Phaser示例允许的注册任务数上限65535,如果参与任务数操作,可用父子Phaser树的方式
public class Phaser {//构造方法//参与任务数为0public Phaser() {...}//制定初始参与任务数//public Phaser(int parties) {...}//指定父容器。子对象整体作为一个参与者加入到父对象,当子对象中没有参与者时,自动从父对象解除注册public Phaser(Phaser parent) {...}public Phaser(Phaser parent, int parties) {...}//增减参与任务数方法//增加一个数,返回当前阶段号public int register() {...}//增加指定个数,返回当前阶段号public int bulkRegister(int parties) {...}//减少一个任务数,返回当前阶段号public int arriveAndDeregister() {...}//到达、等待方法//到达(任务完成),返回当前阶段号public int arrive() {...}//到达后等待其他任务到达,返回到达阶段号public int arriveAndAwaitAdvance() {...}//在指定阶段等待(必须是当前阶段才有效)public int awaitAdvance(int phase) {...}public int awaitAdvanceInterruptibly(int phase){...}public int awaitAdvanceInterruptibly(int phase,long timeout, TimeUnit unit){...}//阶段到达触发动作//类似CyclicBarrier触发命令,通过重写该方法来增加阶段到达动作,该方法返回true将终结Phaser对象protected boolean onAdvance(int phase, int registeredParties) {...}//其他API//强制结束public void forceTermination() {...}//获取当前阶段号public final int getPhase() {...}//判断是否结束public boolean isTerminated() {...}}

如图:

好了,在最后,我们总结以下CountDownLatch、CyclicBarrier、Phaser的使用:

1.等待N个条件到达:CountDownLatch、Phaser

2.等待一起出发:CountDownLatch、CyclicBarrier、Phaser

3.不变参与数,多阶段等待一起出发:CyclicBarrier、Phaser

4.可变参与数,多阶段等待一起出发:Phaser

这篇关于多线程-并发:介绍Phaser的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/578135

相关文章

Java中 instanceof 的用法详细介绍

《Java中instanceof的用法详细介绍》在Java中,instanceof是一个二元运算符(类型比较操作符),用于检查一个对象是否是某个特定类、接口的实例,或者是否是其子类的实例,这篇文章... 目录引言基本语法基本作用1. 检查对象是否是指定类的实例2. 检查对象是否是子类的实例3. 检查对象是否

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

什么是ReFS 文件系统? ntfs和refs的优缺点区别介绍

《什么是ReFS文件系统?ntfs和refs的优缺点区别介绍》最近有用户在Win11Insider的安装界面中发现,可以使用ReFS来格式化硬盘,这是不是意味着,ReFS有望在未来成为W... 数十年以来,Windows 系统一直将 NTFS 作为「内置硬盘」的默认文件系统。不过近些年来,微软还在研发一款名

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制