博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程同步辅助类CyclicBarrier
阅读量:5245 次
发布时间:2019-06-14

本文共 2973 字,大约阅读时间需要 9 分钟。

 CyclicBarrier 是一个可重置的多路同步点,在某些并行编程风格中很有用。

集合点同步:CyclicBarrier

多条线程同时执行一个阶段性任务时,相互等待,等到最后一个线程执行完阶段后,才能一起执行下一段任务.

场景:

和朋友组队去游玩,再爬山,在吃饭,再KTV

 

 

第一个人爬山到顶之后要等待其他的三个人也到顶再下山吃饭,

第一个人吃完饭之后要等待之后的三个人也吃晚饭,再去KTV

这四个人相当于四条线程,而这些任务就设定了一一个个的点,这种点称之为集合点.

CyclicBarrier就是在集合点同步.

 

 

CyclicBarrier和CountDownLatch很相似,但是CyclicBarrier有一个reset能回到初始状态, CountDownLatch不可以.

还有一个很明显的区别是, CyclicBarrier同一类线程之间相互等待.

CountDownLatch是其他类线程等待另一类线程来唤醒它们...

 

  CyclicBarrierDemo.java

1 import java.util.Random; 2 import java.util.concurrent.BrokenBarrierException; 3 import java.util.concurrent.CyclicBarrier; 4 import java.util.concurrent.TimeUnit; 5  6 public class CyclicBarrierDemo { 7  8     public static void main(String[] args) { 9         final CyclicBarrier cb = new CyclicBarrier(4);10         11         for (int i = 0; i < 4; i++) {12             13             new Thread(new Runnable() {14                 15                 @Override16                 public void run() {17                     18                     try {19                         System.out.println(Thread.currentThread().getName()+" :爬山。。。");20                         TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1);21                         System.out.println(Thread.currentThread().getName()+" :到达山顶了。。。");22                         cb.await();//await 就是集合点  等待,直到计数器变为0为止23                         24                         System.out.println(Thread.currentThread().getName()+" :吃饭。。。");25                         TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1);26                         System.out.println(Thread.currentThread().getName()+" :吃完饭了。。。");27                         cb.await();//等待,直到计数器变为0为止28                         29                         System.out.println(Thread.currentThread().getName()+" :KTV。。。");30                         TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1);31                         System.out.println(Thread.currentThread().getName()+" :唱完歌了。。。");32                         cb.await();//等待,直到计数器变为0为止33                         34                         System.out.println(Thread.currentThread().getName()+":回家");35                         36                     } catch (InterruptedException e) {37                         e.printStackTrace();38                     } catch (BrokenBarrierException e) {39                         e.printStackTrace();40                     }41                     42                 }43             }).start();44         }45         46     }47 }

 运行结果:

Thread-0 :爬山。。。Thread-2 :爬山。。。Thread-1 :爬山。。。Thread-3 :爬山。。。Thread-2 :到达山顶了。。。Thread-1 :到达山顶了。。。Thread-0 :到达山顶了。。。Thread-3 :到达山顶了。。。Thread-3 :吃饭。。。Thread-2 :吃饭。。。Thread-0 :吃饭。。。Thread-1 :吃饭。。。Thread-3 :吃完饭了。。。Thread-2 :吃完饭了。。。Thread-1 :吃完饭了。。。Thread-0 :吃完饭了。。。Thread-0 :KTV。。。Thread-2 :KTV。。。Thread-3 :KTV。。。Thread-1 :KTV。。。Thread-3 :唱完歌了。。。Thread-1 :唱完歌了。。。Thread-0 :唱完歌了。。。Thread-2 :唱完歌了。。。Thread-2:回家Thread-3:回家Thread-1:回家Thread-0:回家

 

转载于:https://www.cnblogs.com/DreamDrive/p/6206265.html

你可能感兴趣的文章
D2.Reactjs 操作事件、状态改变、路由
查看>>
一些感想———写在面完腾讯之后
查看>>
1.冒泡排序法
查看>>
宽字符转窄字符CW2AEX<>(szAreaInfo,CP_UTF8)
查看>>
Component Art UI Framework
查看>>
EF终于也有了IDbContextFactory
查看>>
安装 protobuf
查看>>
NSUserDefaults无法保存数据<转>
查看>>
Java EJX
查看>>
cas原理简介
查看>>
并发、并行、同步、异步、多线程的区别
查看>>
[实践]使用JarJar优雅的发布依赖包
查看>>
[置顶] 三五杆枪,可干革命,三五个人,可以创业
查看>>
getElementByName()和getElementById的区别
查看>>
存储过程转账
查看>>
C#中 从本地DataTable中 查询符合条件的数据
查看>>
音乐之声
查看>>
ppt点击文字出现图片,再次点击消失
查看>>
【转】Eclipse 常用快捷键 (动画讲解)
查看>>
Centos7配置ThinkPHP5.0完整过程(一)
查看>>