线程工具CyclicBarrier

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

CyclicBarrier工具的作用:

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

示例代


      package testFuture;
      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);
              for(int i=0;i<3;i++){
                  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();
          }
      }
  
 

码如下:

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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