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

集合点同步:CyclicBarrier

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

场景:

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

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

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

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

CyclicBarrier就是在集合点同步.

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

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

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

CyclicBarrierDemo.java

 import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit; public class CyclicBarrierDemo { public static void main(String[] args) {
final CyclicBarrier cb = new CyclicBarrier(4); for (int i = 0; i < 4; i++) { new Thread(new Runnable() { @Override
public void run() { try {
System.out.println(Thread.currentThread().getName()+" :爬山。。。");
TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1);
System.out.println(Thread.currentThread().getName()+" :到达山顶了。。。");
cb.await();//await 就是集合点 等待,直到计数器变为0为止 System.out.println(Thread.currentThread().getName()+" :吃饭。。。");
TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1);
System.out.println(Thread.currentThread().getName()+" :吃完饭了。。。");
cb.await();//等待,直到计数器变为0为止 System.out.println(Thread.currentThread().getName()+" :KTV。。。");
TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1);
System.out.println(Thread.currentThread().getName()+" :唱完歌了。。。");
cb.await();//等待,直到计数器变为0为止 System.out.println(Thread.currentThread().getName()+":回家"); } catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
} }
}).start();
} }
}

运行结果:

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:回家

线程同步辅助类CyclicBarrier的更多相关文章

  1. JAVA线程同步辅助类CyclicBarrier循环屏障

    CyclicBarrier是一个同步辅助类,主要作用是让一组线程互相等待,知道都到达一个公共障点,在一起走.在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrie ...

  2. JAVA线程同步辅助类CountDownLatch

    一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 用给定的计数 初始化 CountDownLatch.由于调用了 countDown() 方法,所以在当前计数到达 ...

  3. Java八个并发学习——线程同步工具CyclicBarrier

    本文是一篇文章对网络的研究摘要,感谢您的无私分享. CyclicBarrier 类有一个整数初始值,此值表示将在同一点同步的线程数量.当当中一个线程到达确定点,它会调用await() 方法来等待其它线 ...

  4. java并发之同步辅助类CyclicBarrier和CountDownLatch

    CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门, ...

  5. JAVA线程同步辅助类Exchanger-交换

    可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象.Exchanger 可能被视为 Synchro ...

  6. 线程同步辅助类——Exchanger

    下面是java6中文API对Exchanger的解释: 能够在对中对元素进行配对和交换的线程的同步点.每一个线程将条目上的某个方法呈现给 exchange 方法.与伙伴线程进行匹配,而且在返回时接收其 ...

  7. java并发之同步辅助类(Semphore、CountDownLatch、CyclicBarrier、Phaser)

    线程同步辅助类,主要学习两点: 1.上述几种同步辅助类的作用以及常用的方法 2.适用场景,如果有适当的场景可以用到,那无疑是最好的 semaphore(seməˌfôr) 含义 信号量就是可以声明多把 ...

  8. java并发编程JUC第十篇:CyclicBarrier线程同步

    在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...

  9. Java并发编程的4个同步辅助类(CountDownLatch、CyclicBarrier、Semaphore、Phaser)

    我在<JDK1.5引入的concurrent包>中,曾经介绍过CountDownLatch.CyclicBarrier两个类,还给出了CountDownLatch的演示案例.这里再系统总结 ...

随机推荐

  1. 交换机的Access口与Trunk口

    基本概念 Access类型的端口只能属于1个VLAN,一般用于连接计算机的端口:Trunk类型的端口可以允许多个VLAN通过,可以接收和发送多个VLAN的报文,一般用于交换机之间连接的端口: 处理流程 ...

  2. Linux系统下修改环境变量PATH路径

    方法一: PATH=$PATH:/etc/apache/bin 该方法只对当前会话有效,每次注销或者拿出系统,该设置就会无效 方法二: vi /etc/profile 在适当的位置写入:PATH=$P ...

  3. excel怎样添加的选项卡中含有下拉列表

    <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <ribbon s ...

  4. Arria10 SDI II学习笔记

    12G-SDI16是什么意思? 关于 int_vpid_byte1 int_vpid_byte2 int_vpid_byte3 int_vpid_byte4 这些参数是不是如果外部数据有就不需要传输, ...

  5. vip导致的serverConnection closed by foreign host问题

    问题描述: 应应用需求,设计搭建了一套带tokudb存储引擎的percona数据库,使用的是常见的双主架构.具体的架构如下图所示: 在172.20.32.x1上进行验证的时候出现了下面的问题: FHo ...

  6. ubuntu server sudo出现sudo:must be setuid root 完美解决办法

    原文链接:http://blog.csdn.net/supercrsky/article/details/9788397 1.开机按shift或esc先进行recovery模式 2.选择root命令行 ...

  7. shell实现linux回收站的功能

    shell实现linux回收站的功能 下载: https://gitee.com/LoongWang/shellrecycling/repository/archive/master.zip 代码: ...

  8. Huffman 编码压缩算法

    前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法.相信大家应该听说过 David Huffman 和他的压缩算法—— Huffman Code,一种通过字 ...

  9. 1.java面向对象编程三大特性之封装

    封装即把一个对象的属性.行为等放在一个实体类中隐藏起来,不允许外部对其进行修改,但是被封装的属性.行为会对外提供一个接口与外部联系,这个对外的接口通常情况下就是set().get()方法.可以通过se ...

  10. delphi中OleContainer的使用总结

    1:定义流的header , OleContainer要求流中要有Headertype //流Header的结构 TStreamHeader = record Signature: Integer; ...