线程工具CyclicBarrier

举报
yd_57386892 发表于 2021/05/16 01:56:33 2021/05/16
【摘要】 CyclicBarrier工具的作用: 控制线程池中的所有线程全执行到某一个集合点时(即某一行代码)时,所有线程才能继续执行一集合点后面的代码,并前往下一个集合点,哪怕有1个线程还未到,那么其它线程将等待这个线程到达指定集合点。这就好比我们跟团去旅游,只有大家全部到达了指定地点,我们的大巴车才能出发。当我们到达了景区下车自由活动后,所有人员又必须得到第二个指定集合点,我们的...

CyclicBarrier工具的作用:

控制线程池中的所有线程全执行到某一个集合点时(即某一行代码)时,所有线程才能继续执行一集合点后面的代码,并前往下一个集合点,哪怕有1个线程还未到,那么其它线程将等待这个线程到达指定集合点。这就好比我们跟团去旅游,只有大家全部到达了指定地点,我们的大巴车才能出发。当我们到达了景区下车自由活动后,所有人员又必须得到第二个指定集合点,我们的大巴才能回家。依次类推,也可以有第3,第4...个集合点。

示例代


  
  1. package testFuture;
  2. import java.util.concurrent.CyclicBarrier;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. public class CyclicBarrierTest {
  6.     public static void main(String[] args) {
  7.         ExecutorService service = Executors.newCachedThreadPool();
  8.         final  CyclicBarrier cb = new CyclicBarrier(3);
  9.         for(int i=0;i<3;i++){
  10.             Runnable runnable = new Runnable(){
  11.                     public void run(){
  12.                     try {
  13.                         Thread.sleep((long)(Math.random()*10000));    
  14.                         System.out.println("线程" + Thread.currentThread().getName() + 
  15.                                 "即将到达集合地点1,当前已有" + (cb.getNumberWaiting()+1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));                        
  16.                         cb.await();   //在集合点等待其它线程也执行到这里,然后才能往下执行。
  17.                         
  18.                         Thread.sleep((long)(Math.random()*10000));    
  19.                         System.out.println("线程" + Thread.currentThread().getName() + 
  20.                                 "即将到达集合地点2,当前已有" + (cb.getNumberWaiting()+1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
  21.                         cb.await();     //在集合点等待其它线程也执行到这里,然后才能往下执行。
  22.                         Thread.sleep((long)(Math.random()*10000));    
  23.                         System.out.println("线程" + Thread.currentThread().getName() + 
  24.                                 "即将到达集合地点3,当前已有" + (cb.getNumberWaiting() + 1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));                        
  25.                         cb.await();     //在集合点等待其它线程也执行到这里,然后才能往下执行。                
  26.                     } catch (Exception e) {
  27.                         e.printStackTrace();
  28.                     }                
  29.                 }
  30.             };
  31.             service.execute(runnable);
  32.         }
  33.         service.shutdown();
  34.     }
  35. }

码如下:

文章来源: blog.csdn.net,作者:冉航--小虾米,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/gaoxiaoweiandy/article/details/116372640

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。