多线程-并发:介绍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

相关文章

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的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2