java5 CyclicBarrier同步工具
CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点(common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时CyclicBarrier很有用。因为该barrier 在释放等待线程后可以重用,所以称它为循环的barrier。
CyclicBarrier支持一个可选的Runnable命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作很有用。
例如:组织人员(线程)郊游,约定一个时间地点(路障),人员陆续到达地点,等所有人员全部到达,开始到公园各玩各的,再到约定时间去食堂吃饭,等所有人到齐开饭……
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 | package com.ljq.test.thread; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CyclicBarrierTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); final CyclicBarrier cb = new CyclicBarrier( 3 ); //约定3个人 for ( int i= 0 ;i< 3 ;i++){ //产生3个人 Runnable runnable = new Runnable(){ public void run(){ try { Thread.sleep(( long )(Math.random()* 10000 )); System.out.println( "线程" + Thread.currentThread().getName() + "即将到达集合地点1,当前已有" + (cb.getNumberWaiting()+ 1 ) + "个已经到达," + (cb.getNumberWaiting()== 2 ? "都到齐了,继续走啊" : "正在等候" )); cb.await(); Thread.sleep(( long )(Math.random()* 10000 )); System.out.println( "线程" + Thread.currentThread().getName() + "即将到达集合地点2,当前已有" + (cb.getNumberWaiting()+ 1 ) + "个已经到达," + (cb.getNumberWaiting()== 2 ? "都到齐了,继续走啊" : "正在等候" )); cb.await(); Thread.sleep(( long )(Math.random()* 10000 )); System.out.println( "线程" + Thread.currentThread().getName() + "即将到达集合地点3,当前已有" + (cb.getNumberWaiting() + 1 ) + "个已经到达," + (cb.getNumberWaiting()== 2 ? "都到齐了,继续走啊" : "正在等候" )); cb.await(); } catch (Exception e) { e.printStackTrace(); } } }; service.execute(runnable); } service.shutdown(); } } |
打印结果:
1 2 3 4 5 6 7 8 9 | 线程pool- 1 -thread- 1 即将到达集合地点 1 ,当前已有 1 个已经到达,正在等候 线程pool- 1 -thread- 3 即将到达集合地点 1 ,当前已有 2 个已经到达,正在等候 线程pool- 1 -thread- 2 即将到达集合地点 1 ,当前已有 3 个已经到达,都到齐了,继续走啊 线程pool- 1 -thread- 2 即将到达集合地点 2 ,当前已有 1 个已经到达,正在等候 线程pool- 1 -thread- 3 即将到达集合地点 2 ,当前已有 2 个已经到达,正在等候 线程pool- 1 -thread- 1 即将到达集合地点 2 ,当前已有 3 个已经到达,都到齐了,继续走啊 线程pool- 1 -thread- 2 即将到达集合地点 3 ,当前已有 1 个已经到达,正在等候 线程pool- 1 -thread- 1 即将到达集合地点 3 ,当前已有 2 个已经到达,正在等候 线程pool- 1 -thread- 3 即将到达集合地点 3 ,当前已有 3 个已经到达,都到齐了,继续走啊 |
分类:
Java多线程编程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」