Java 入门指南:Java 并发编程 —— 同步工具类 Phaser(相位器)

news2024/9/21 17:58:24

文章目录

    • 同步工具类
    • Phaser
      • 主要特点
      • 核心方法
      • 使用步骤
      • 适用场景
      • 使用示例

同步工具类

JUC(Java.util.concurrent)是 Java 提供的用于并发编程的工具类库,其中包含了一些通信工具类,用于在多个线程之间进行协调和通信,特别是在多线程和网络通信方面。这些工具类提供了丰富的功能,帮助开发者高效地实现复杂的并发控制和网络通信需求。

![[JUC Communication Utilities.png]]

Phaser

Phaser(相位器)是Java中的一种同步辅助类,用于控制多个线程的阶段性任务同步。它提供了更灵活和高级的同步机制,可以动态地适应参与线程的数量。

Phaser 可以看作功能增强的 CyclicBarrier,与 CyclicBarrier(循环屏障) 和 CountDownLatch(倒计时门闩) 等传统同步工具相比,Phaser 提供了更灵活和更高级的功能,特别是在处理动态和可变的并行任务集合时。

Phaser 将任务分解为多个阶段,每个阶段包含一组线程需要同步执行的任务。在每个阶段的结束点,所有参与线程需要等待其他线程完成当前阶段的任务。当所有线程都完成当前阶段的任务后,Phaser 会进入下一个阶段,并且所有线程可以继续执行下一阶段的任务。

主要特点

  1. 动态注册与注销Phaser 允许在运行时动态地增加或减少参与者,这使得它非常适合那些在运行过程中需要动态调整线程数量的场景。

  2. 多阶段任务同步Phaser 支持多个阶段任务的同步,每个阶段可以有不同数量的参与者。这使得它能够将一个复杂任务划分为多个阶段,每个阶段由多个线程并行执行。

  3. 高度灵活性Phaser 的设计灵感来源于 CyclicBarrierCountDownLatch,但它提供了更加灵活的特性,如自定义行为(通过 onAdvance() 方法)等。

核心方法

  1. register():用于在 Phaser 中注册一个新的参与者。当一个线程需要加入 Phaser 同步时,可以调用此方法。

  2. arrive():表示一个参与者已经完成了当前阶段的任务。当一个线程完成任务时,可以调用此方法。此方法不会阻塞当前线程,但会更新Phaser的内部状态。

  3. arriveAndAwaitAdvance():与 arrive() 类似,但它还会让当前线程等待其他参与者完成当前阶段。在所有参与者都完成当前阶段任务之前,此方法会阻塞当前线程。

  4. getPhase():用于获取当前 Phaser 的阶段数。此方法返回一个整数,表示 Phaser 经历了多少个阶段。

  5. onAdvance():在每个阶段结束时被 Phaser 自动调用。此方法可以被重写以实现自定义行为,如在每个阶段结束时执行特定操作。默认情况下,此方法返回 false,表示 Phaser 应该继续下一阶段;如果返回 true,则表示 Phaser 应该终止。

使用步骤

使用 Phaser 的基本步骤如下:

  1. 创建一个 Phaser 对象,并指定参与线程的数量。

  2. 在每个参与线程中,执行任务,并在任务结束点调用phaser.arriveAndAwaitAdvance(),表示线程到达当前阶段的结束点,等待其他线程。

  3. 当所有线程都调用了 arriveAndAwaitAdvance() 方法后,Phaser 进入下一个阶段,并且所有线程可以继续执行下一阶段的任务。

Phaser 还提供了其他一些方法,如 arrive()awaitAdvance()onAdvance() 等,以便更灵活地控制线程的同步和阶段转换。

需要注意的是,Phaser 是可以重用的,调用了arriveAndAwaitAdvance() 方法的线程数量可以不同于初始的参与线程数量。

Phaser 也可以用于实现类似于 CyclicBarrierCountDownLatch 的功能。

Phaser 在需要灵活控制和同步多个线程任务的场景中非常有用,可以提供高级的线程协调和同步机制。

适用场景

Phaser 的特点和应用场景包括:

  1. 动态注册:Phaser 的参与线程数可以动态地增加或减少。新的线程可以在任何阶段加入,并参与后续的任务同步。

  2. 灵活的同步控制:Phaser 可以对每个阶段的线程到达进行控制,可以灵活地选择等待所有线程或等待特定数量的线程。

  3. 分阶段任务控制:Phaser 可以将复杂任务分解为多个阶段,每个阶段可以包含多个线程,并且可以轻松地控制线程在每个阶段的同步处理。

  4. 异步任务协调:Phaser 支持线程之间的分离和重组,可以实现异步任务的协调。

使用示例

以下是一个使用 Phaser 实现多阶段任务同步的简单示例:

import java.util.concurrent.Phaser;  
  
public class PhaserDemo {  
    public static void main(String[] args) {  
        int parties = 3; // 参与者数量  
        int phases = 4;  // 阶段数量  
  
        final Phaser phaser = new Phaser(parties) {  
            @Override  
            protected boolean onAdvance(int phase, int registeredParties) {  
                System.out.println("====== Phase : " + phase + " ======");  
                return registeredParties == 0; // 如果没有参与者,则结束Phaser  
            }  
        };  
  
        for (int i = 0; i < parties; i++) {  
            int threadId = i;  
            Thread thread = new Thread(() -> {  
                for (int phase = 0; phase < phases; phase++) {  
                    System.out.println(String.format("Thread %s, phase %s", threadId, phase));  
                    phaser.arriveAndAwaitAdvance();  
                }  
            });  
            thread.start();  
        }  
    }  
}

在这个示例中,我们创建了一个包含3个参与者和4个阶段的 Phaser。每个参与者都会执行一个循环,遍历所有阶段,并在每个阶段结束时调用 arriveAndAwaitAdvance() 方法等待其他参与者。当所有参与者都到达某个阶段时,该阶段就会结束,并且 Phaser 会进入下一个阶段。在每个阶段结束时,onAdvance() 方法会被调用,并打印出当前阶段的编号。

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

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

相关文章

Ton链历险记(一)

系列文章目录 文章目录 系列文章目录前言第一天、FunC环境安装总结 前言 欢迎来到神秘的web3小镇&#xff0c;这里是充满未知和魔法的土地&#xff0c;神兽出没&#xff0c;超能力攻击&#xff0c;卡牌收集。。。 穷困却又励志的无天赋法师木森。因为没有交够保护费&#xff…

Spring和Spring FrameWork有什么关系?两者是同一个东西吗?

Spring和Spring Framework之间的关系可以归结为以下几点&#xff1a; 广义与狭义的理解 广义上的Spring&#xff1a; 广义上的Spring泛指以Spring Framework为基础的整个Spring技术栈。Spring已经发展成为一个由多个不同子项目&#xff08;模块&#xff09;组成的成熟技术体系…

R语言统计分析——功效分析2(t检验,ANOVA)

参考资料&#xff1a;R语言实战【第2版】 1、t检验 对于t检验&#xff0c;pwr.t.test()函数提供了许多有用的功效分析选项&#xff0c;如下&#xff1a; pwr.t.test(n,d,sig.level,power,type,alternative) 其中&#xff0c;n为样本大小&#xff1b; d为效应值&#xff0c;即…

【每日一题】LeetCode 98.验证二叉搜索树(树、深度优先搜索、二叉搜索树、二叉树)

【每日一题】LeetCode 98.验证二叉搜索树&#xff08;树、深度优先搜索、二叉搜索树、二叉树&#xff09; 题目描述 给定一个二叉树的根节点 root&#xff0c;判断该二叉树是否是一个有效的二叉搜索树&#xff08;BST&#xff09;。有效的二叉搜索树需要满足以下条件&#xf…

R语言xlsx,txt文件处理:以《书摘》00年-10年资源合集整理为例

偶然间读到一篇文章&#xff0c;分享06年《书摘》的内容&#xff0c;今天来看都不过时&#xff0c;所以起了找下这本老杂志合集的心思。 傅佩荣先生《哲学与人生》选段 “如果有人觉得活着很辛苦&#xff0c;面对自己又感觉无聊乏味&#xff0c;那么他应该多接触自然界。我有个…

9.11.

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), speecher(new QTextToSpeech(this)) {//设置时钟ui->setupUi(this);startTimer(1000);//文本框label居中对齐ui->label_2->setAlignment(Qt::AlignCenter);connect(this,&Widget::my_sign…

QT:音视频播放器

目录 一.播放器设计 二.需要使用的控件 三.选择视频 四.播放视频 五.暂停视频 六.关闭视频 七.播放状态设置 八.切换视频(上一首) 九.切换视频(下一首) 十.设置视频滑块 十一.更新滑块显示 十二.实现效果 十三.代码设计 1.mainwindow.h 2.mainwindow.cpp 一.播放…

国产视频转换HDMI1.4转单/双MIPI DSI/CSI LT6911C芯片方案,带音频输出,QFN64封装 Lontium

LT6911C:HDMI 1.4 TO MIPI DSI/CSI 芯片简介&#xff1a; LT6911C是一款高性能的HDMI1.4转换器MIPI DSI/CSI芯片用于VR/智能手机/显示应用。对于MIPI DSI/CSI输出&#xff0c;LT6911C功能可配置单端口或双端口MIPIDSI/CSI 1高速时钟通道和1~4个高速数据通道最大1.5Gb/s/lane&am…

SSHamble:一款针对SSH技术安全的研究与分析工具

关于SSHamble SSHamble是一款功能强大的SSH技术安全分析与研究工具&#xff0c;该工具基于Go语言开发&#xff0c;可以帮助广大研究人员更好地分析SSH相关的安全技术与缺陷问题。 功能介绍 SSHamble 是用于 SSH 实现的研究工具&#xff0c;其中包含下列功能&#xff1a; 1、针…

【算法思想·二叉搜索树】特性篇

本文参考labuladong算法笔记[二叉搜索树心法&#xff08;特性篇&#xff09; | labuladong 的算法笔记] 1、概述 首先&#xff0c;BST&#xff08;binary search tree&#xff09; 的特性大家应该都很熟悉了&#xff08;详见基础知识章节的 二叉树基础&#xff09;&#xff1a…

【QGC】把QGroundControl地面站添加到Ubuntu侧边菜单栏启动

把QGroundControl地面站添加到Ubuntu侧边菜单栏启动 简介准备工作步骤 1: 创建 Desktop Entry 文件步骤 2: 编辑 Desktop Entry 文件步骤 3: 刷新应用程序菜单步骤 4: 将 QGroundControl 固定到侧边栏 环境&#xff1a; Ubuntu &#xff1a;20.04 LTS 简介 QGroundControl 是…

[综述笔记]Federated learning for medical image analysis: A survey

论文网址&#xff1a;Federated learning for medical image analysis: A survey - ScienceDirect 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&…

C++ Primer Plus(速记版)-基本语言

序章 快速入门 初窥输入/输出 C 并没有直接定义进行输入或输出(I/O)的任何语句&#xff0c;这种功能是由标准库提供的。 本书的大多数例子都使用了处理格式化输入和输出的 iostream 库。 iostream 库的基础是两种命名为 istream 和 ostream 的类型&#xff0c;分别表示输入流和…

卷积神经网络-经典分类网络结构(LetNet-5,AlexNet)

目录 一&#xff1a;LeNet-5解析 1.网络结构 输入层&#xff1a; 1.conv1&#xff1a; 2.pool1层&#xff1a; 3.conv2&#xff1a; 4.pool2&#xff1a; 5.fc3&#xff0c;fc4&#xff1a; 6.output层: 2.参数形状 二&#xff1a;AlexNet 1层&#xff1a; 2层&am…

招生管理|基于Java+vue的招生管理系统(源码+数据库+文档)

招生管理|学生管理系统|高校招生管理 目录 基于Javavue的招生管理系统 一、前言 二、系统设计 三、系统功能设计 系统功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|…

什么是OAuth 2.0?OAuth 2.0的工作流程是什么?与OAuth 1.0有哪些区别?

在浏览网页时&#xff0c;你肯定会遇到允许你使用社交媒体账户登录的网站。此功能一般是使用流行的OAuth 2.0框架构建的。OAuth 2.0是对OAuth 1.0的彻底重写&#xff0c;OAuth 2.0与OAuth 1.0或1.1不向后兼容。 1. OAuth产生背景 为了更好的理解OAuth&#xff0c;我们假设有如…

CAN总线-STM32上CAN外设

1.STM32 CAN外设简介 2.CAN网拓扑结构 3.CAN收发器电路 4.CAN框图 5.CAN基本结构 6.发送过程 7.接收过程 8.发送和接收配置位 9.标识过滤器&#xff08;重点&#xff09; 这里的FBMX模式设置的列表模式&#xff1a;你在列表中输入你想要的报文ID&#xff0c;不在你列表中的ID屏…

css grid布局属性详解

Grid布局 前言一、认识Grid1.1容器和项目1.2行和列1.3单元格和网格线 二、容器属性2.1.grid-template-columns与grid-template-rows属性2.1.1 直接使用长度单位比如px2.1.2 使用百分比 %2.1.3 使用repeat函数2.1.4 按比例划分 fr 关键字2.1.5 自动填充 auto 关键字2.1.6 最大值…

c4d的重命名工具(支持模型和材质) 及 python窗口定义

不是我牛逼&#xff0c;是豆包牛逼&#xff01; 一个简化版的窗口 import c4d from c4d import guiclass MyDialog(gui.GeDialog):def __init__(self):super().__init__()self.SetTitle("My Dialog")def CreateLayout(self):# 设置对话框布局return Truemy_dialog …

C语言补习课番外篇——采样sin(x)

需求&#xff1a;让stm32的DAC输出正弦波形 分析&#xff1a;DAC的原理这里不作过多介绍。在[0.2π]的定义域内对sin(x)的值域进行采样&#xff0c;采样次数为256次&#xff1b;采样结果需要等比例缩放到0~4095的无符号数范围内&#xff0c;并且输出到一个SinFile.txt文本文档…