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

相关文章

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

Spring Security 前后端分离场景下的会话并发管理

《SpringSecurity前后端分离场景下的会话并发管理》本文介绍了在前后端分离架构下实现SpringSecurity会话并发管理的问题,传统Web开发中只需简单配置sessionManage... 目录背景分析传统 web 开发中的 sessionManagement 入口ConcurrentSess

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

MySQL中处理数据的并发一致性的实现示例

《MySQL中处理数据的并发一致性的实现示例》在MySQL中处理数据的并发一致性是确保多个用户或应用程序同时访问和修改数据库时,不会导致数据冲突、数据丢失或数据不一致,MySQL通过事务和锁机制来管理... 目录一、事务(Transactions)1. 事务控制语句二、锁(Locks)1. 锁类型2. 锁粒

深入解析Java NIO在高并发场景下的性能优化实践指南

《深入解析JavaNIO在高并发场景下的性能优化实践指南》随着互联网业务不断演进,对高并发、低延时网络服务的需求日益增长,本文将深入解析JavaNIO在高并发场景下的性能优化方法,希望对大家有所帮助... 目录简介一、技术背景与应用场景二、核心原理深入分析2.1 Selector多路复用2.2 Buffer

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.