学习了解CyclicBarrier
CyclicBarrier我的理解就是一个线程等待器,用途就是将注册了这个barrier的线程卡在同一个位置,直到注册这个barrier的所有线程都完成之后,继续执行。
下面是一个学习过程中采用的示例,计算每个学生分别的成绩,然后统一汇总计算全班成绩
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | package cyclic; import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class CyclicBarrierDemo { public static void main(String[] args) { List<String> students = Arrays.asList( "Tom" , "Bill" , "Dick" , "Marry" , "Lily" , "Harry" ); StudentCalc calc = new StudentCalc(); CyclicBarrier cyclicBarrier = new CyclicBarrier(students.size(), new TotalScore(calc)); //所有注册cyclicBarrier的线程完成后才会执行TotalScore线程 students.forEach(x-> new Thread( new StudentScore(cyclicBarrier,calc,x)).start()); System.out.println( "我在主线程" ); //对后续无影响 } } class TotalScore implements Runnable{ private StudentCalc studentCalc; TotalScore(StudentCalc studentCalc) { this .studentCalc = studentCalc; } @Override public void run() { studentCalc.total(); //总成绩 计算 } } class StudentScore implements Runnable{ private CyclicBarrier barrier; private StudentCalc studentCalc; private String studentName; public StudentScore(CyclicBarrier barrier, StudentCalc studentCalc, String studentName) { this .barrier = barrier; this .studentCalc = studentCalc; this .studentName = studentName; } @Override public void run() { studentCalc.student(studentName); try { this .barrier.await(); //计算完成后等待其他线程 } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } } /** * 计算类 */ class StudentCalc { /** * 全部成绩计算完成后,调用汇总 */ public void total(){ System.out.println( "全体学生成绩汇总计算" ); } /** * 计算每个学生自己成绩,为了模拟每个学生计算时间不同,使用Thread.sleep区分 * @param student */ public void student(String student){ try { Thread.sleep( new Random().nextInt( 2000 )); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println( "计算" + student + "成绩" ); } } |
示例很简单,具体CyclicBarrier是如何实现的,后面在慢慢研究。
输出结果不固定如下所示:
我在主线程
计算Lily成绩
计算Bill成绩
计算Tom成绩
计算Dick成绩
计算Marry成绩
计算Harry成绩
全体学生成绩汇总计算
分类:
java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了