Java多线程中如何实现Phaser同步屏障
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章将为大家详细讲解有关Java多线程中如何实现Phaser同步屏障,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言是否会遇到这样的场景,你向线
千家信息网最后更新 2025年11月07日Java多线程中如何实现Phaser同步屏障
这篇文章将为大家详细讲解有关Java多线程中如何实现Phaser同步屏障,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
前言
是否会遇到这样的场景,你向线程池提交了多个任务,你希望这批任务全部完成后能够反向通知你。
你可能会使用线程计数的方式,等到计数器累加到提交的线程数量,然后通知。emmm,不是不可以,只是不够优雅。本文提供优雅的实现方式,Phaser同步屏障。
Maven依赖
也可以不依赖,本人习惯把代码简单化,使用了hutool,所以依赖只有这个。
cn.hutool hutool-all 5.7.15
代码
废话不多说,上代码。
package com.huyi.csdn.tools; import cn.hutool.core.thread.ThreadUtil; import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Phaser;import java.util.concurrent.TimeUnit; /** * @Program: csdn @ClassName: PhaserUtil @Author: huyi @Date: 2021-11-06 21:03 @Description: * 多线程监控回调工具 @Version: V1.0 */public class PhaserUtil { public static final ExecutorService executorService = Executors.newFixedThreadPool(50); public static class CustomPharser extends Phaser { private final Runnable runnable; public CustomPharser(Runnable runnable) { this.runnable = runnable; } @Override protected boolean onAdvance(int phase, int registeredParties) { this.runnable.run(); return super.onAdvance(phase, registeredParties); } } /** * 提交任务以及完成后需要执行的内容 * * @param tasks 任务 * @param complete 完成任务 */ public static void submit(List tasks, Runnable complete) { Phaser phaser = new CustomPharser(complete); for (Runnable runnable : tasks) { executorService.submit( () -> { phaser.register(); runnable.run(); System.out.println(Thread.currentThread().getName() + "完成任务!"); phaser.arriveAndAwaitAdvance(); }); } } /** 摧毁线程池 */ public static void destroy() { System.out.println("摧毁线程池"); executorService.shutdown(); } public static void main(String[] args) { List tasks = new ArrayList<>(); Random random = new Random(); for (int i = 0; i < 10; i++) { tasks.add( () -> { ThreadUtil.sleep(random.nextInt(10), TimeUnit.SECONDS); }); } submit(tasks, () -> System.out.println("所有任务已完成")); ThreadUtil.sleep(20, TimeUnit.SECONDS); destroy(); }} 代码说明
1、提交任务执行的方式是Runnable也好,Callable也好,或者Consumer、Function等等,不影响,你可以看着调整。
2、完成后的Runnable也和第一点同理。
验证一下
OK,没什么问题。
关于Java多线程中如何实现Phaser同步屏障就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
线程
任务
屏障
同步
代码
内容
方式
优雅
文章
更多
知识
篇文章
不错
没什么
上代
不够
前言
只是
只有
场景
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
win7 asp 数据库
网络安全应急处置装置
数据库没有外键怎么查询
郑州华夏宏图网络技术有限公司
绿码数据库
河南鸠鸠互联网科技是骟局吗
医院网络安全工作好吗
服务器内部构造解释图
六安数智未来软件开发
steam哪个服务器好用
吉林时代网络技术设计
天下3为什么连接服务器失败
网络安全可以叫什么
网络安全应急预案怎么做
多媒体通信网络技术就业职位
数控系统中的网络技术
木马网络安全教程
软件开发er图
无锡戴尔服务器维修点电话热线
郑州直销网络软件开发
nimax 数据库错误
eos连接数据库失败
江苏网络时间频率同步服务器
数据库死锁的原因及解决办法
武汉好的软件开发多少钱
电信高防服务器
金融IT软件开发工程师
网络安全加密股票
北邮的网络技术研究院怎样
儿童网络安全演讲稿