CyclicBarrier 使用说明

字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。
 
主要方法:
     public int await() throws InterruptedException, BrokenBarrierException
     用来挂起当前线程,直至所有线程都到达barrier状态再同时执行后续任务。
 
例子:
     跟团旅游,没到一个景点导游给介绍完后,让大家自由活动,然后约定好(某个时间)在下一个景点集合。
  
复制代码
 1 import java.util.concurrent.CyclicBarrier;
 2 import java.util.concurrent.ExecutorService;
 3 import java.util.concurrent.Executors;
 4  
 5 public class CyclicBarrierTest {
 6  
 7         public static void main(String[] args) {
 8               ExecutorService service = Executors. newCachedThreadPool();
 9                final CyclicBarrier cb = new CyclicBarrier(3);
10                for(int i = 0; i < 3; i++){
11                      Runnable runnable = new Runnable(){
12                             public void run(){
13                                    try {
14                                          Thread. sleep((long)(Math. random()*10000));     
15                                          System. out.println("线程" + Thread.currentThread().getName() +
16                                                         "即将到达集合地点1,当前已有" + (cb.getNumberWaiting()+1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候" ));                                        
17                                          cb.await();
18                                          
19                                          Thread. sleep((long)(Math. random()*10000));     
20                                          System. out.println("线程" + Thread.currentThread().getName() +
21                                                         "即将到达集合地点2,当前已有" + (cb.getNumberWaiting()+1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候" ));
22                                          cb.await();   
23                                          Thread. sleep((long)(Math. random()*10000));     
24                                          System. out.println("线程" + Thread.currentThread().getName() +
25                                                         "即将到达集合地点3,当前已有" + (cb.getNumberWaiting() + 1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候" ));                                      
26                                          cb.await();                                     
27                                   } catch (Exception e) {
28                                          e.printStackTrace();
29                                   }                          
30                            }
31                      };
32                      service.execute(runnable);
33               }
34               service.shutdown();
35        }
36 }
复制代码

 

posted @   吞噬天帝  阅读(309)  评论(0编辑  收藏  举报
编辑推荐:
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
阅读排行:
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
点击右上角即可分享
微信分享提示