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. str.index()与str.find()比较

    def extract_from_tag(tag,line): opener = "<" + tag + ">" closer = "&l ...

  2. IntelliJ IDEA 2017版 使用笔记(十一) Debug操作:IDEA 快捷键

    调试功能;            缩短项目时间,调高阅读源码的能力.   一.添加断点,选中一行代码,双击即可生成断点(快捷键:ctrl+F8)                二.单步运行,快捷键:s ...

  3. servlet 解决乱码问题

    对于servlet大家应该都很熟悉了,今天再复习一下,如果有哪里写的不好或不对的地点希望广大的网友批评指正.今天只讨论get和post两w种方式,他们之间有很多的不同点,所以解决编码的方式也会不一样, ...

  4. Zookeeper C++编程实战之配置更新

    CZookeeperHelper:https://github.com/eyjian/libmooon/blob/master/include/mooon/net/zookeeper_helper.h ...

  5. 20155326 第十周课下作业-IPC

    20155326 第十周课下作业-IPC 学习题目: 研究Linux下IPC机制:原理,优缺点,每种机制至少给一个示例,提交研究博客的链接 共享内存 管道 FIFO 信号 消息队列 学习过程 -IPC ...

  6. input.php

    <?php /** * */ class Input { function get($index = NULL, $xss_clean = FALSE) { if($index == NULL ...

  7. jQuery插件初级练习2答案

    html: $.font($("p"),"30px").html("变化了") jQuery: $.extend({ font:functi ...

  8. [php-cookie] cookie 请求跨域,如何共享

    cookie 请求跨域的问题, 假设我有两个域名,一个 m.example.com,另一个是 www.example.com . 那么我需要如何设置 cookie 才可以在这两个域名都实现共享呢? / ...

  9. 4.动态HTML处理和机器图像识别

    Selenium Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上, ...

  10. 通过 sysprocesses 简单查询死锁及解决死锁办法

    简单查询死锁,如下四步可以轻松解决: 第一步:查询死锁语句 1: 条件是 blocked <> 0 select dbid,* from sys.sysprocesseswhere 1=1 ...