Java多线程中如何实现Phaser同步屏障
发表于:2025-01-17 作者:千家信息网编辑
千家信息网最后更新 2025年01月17日,这篇文章将为大家详细讲解有关Java多线程中如何实现Phaser同步屏障,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言是否会遇到这样的场景,你向线
千家信息网最后更新 2025年01月17日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(Listtasks, 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安全错误
数据库的锁怎样保障安全
迷你世界怎么关闭云服务器
goe数据库
服务器机房相关图片
esp8266连接本地服务器
思科网络技术学院教程读后感
硬件支持和软件开发
游享星域网络技术
性价比高的分布式数据库事务
环保应用软件开发
软件开发外企待遇
支付宝中国网络技术
iso数据库
嵌入式软件开发技术支持
浪潮服务器按F几进pe系统
韩台湾服务器
qt 数据库 文件格式
电气大类可以去软件开发吗
交通银行软件开发笔试
司法所开展网络安全活动
it三大数据库
内蒙古服务器投产
域名访问本地服务器
中信国安的网络安全
php实现数据库判断
玩游戏服务器连不到
数据库查询学生所有成绩的总分
广州森舒畅互联网科技有限公司
2数据库abs
软件开发公司苏州
c 数据库比较大小写