线程同步辅助类CyclicBarrier
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的更多相关文章
- JAVA线程同步辅助类CyclicBarrier循环屏障
CyclicBarrier是一个同步辅助类,主要作用是让一组线程互相等待,知道都到达一个公共障点,在一起走.在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrie ...
- JAVA线程同步辅助类CountDownLatch
一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 用给定的计数 初始化 CountDownLatch.由于调用了 countDown() 方法,所以在当前计数到达 ...
- Java八个并发学习——线程同步工具CyclicBarrier
本文是一篇文章对网络的研究摘要,感谢您的无私分享. CyclicBarrier 类有一个整数初始值,此值表示将在同一点同步的线程数量.当当中一个线程到达确定点,它会调用await() 方法来等待其它线 ...
- java并发之同步辅助类CyclicBarrier和CountDownLatch
CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门, ...
- JAVA线程同步辅助类Exchanger-交换
可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象.Exchanger 可能被视为 Synchro ...
- 线程同步辅助类——Exchanger
下面是java6中文API对Exchanger的解释: 能够在对中对元素进行配对和交换的线程的同步点.每一个线程将条目上的某个方法呈现给 exchange 方法.与伙伴线程进行匹配,而且在返回时接收其 ...
- java并发之同步辅助类(Semphore、CountDownLatch、CyclicBarrier、Phaser)
线程同步辅助类,主要学习两点: 1.上述几种同步辅助类的作用以及常用的方法 2.适用场景,如果有适当的场景可以用到,那无疑是最好的 semaphore(seməˌfôr) 含义 信号量就是可以声明多把 ...
- java并发编程JUC第十篇:CyclicBarrier线程同步
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...
- Java并发编程的4个同步辅助类(CountDownLatch、CyclicBarrier、Semaphore、Phaser)
我在<JDK1.5引入的concurrent包>中,曾经介绍过CountDownLatch.CyclicBarrier两个类,还给出了CountDownLatch的演示案例.这里再系统总结 ...
随机推荐
- 主机网络ping: unknown host baidu.com问题解决
本机环境: 系统:Centos 网络:NAT 虚拟机之前一直都可以连外网,但最近不能连了,现状如下: [root@vhost03 ~]# ping baidu.comping: unknown hos ...
- 实用shell命令100条
1,echo "aa" > test.txt 和 echo "bb" >> test.txt //>将原文件清空,并且内容写入到文件中, ...
- tlink平台数据转发 c# 控制台程序
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...
- JSP动作元素<jsp:include>和<jsp:param>的搭配使用
最近开发项目中广告头的优化:引入了<jsp:include page="XX.jsp"></jsp:include> 当<jsp:include> ...
- Java关联关系、依赖关系
关联关系 概念:对象和对象之间的连接 定义:A类关联B类,指的是B类对象作为A类的属性存在,称为“has”关联关系 生命周期:如果A类关联B类,那么创建A类的对象时实例化B类的对象,直到A类对象被销毁 ...
- maven工程聚合和继承的意义
聚合的意义: 对于一个大型的项目,如果我们直接作为一个工程开发,由于相互之间的依赖我们只能从头到尾由一组人开发,否则就会出现一个类好多人开发,相互更改的混乱局面,这个时候我们就将项目进行了横向和纵向的 ...
- 团队项目(HCL)
一.团队展示 队名:盐酸队 队员学号及风采: 团队项目描述:经典90坦克大战(基于java) 团队合照: 二.团队选题 经典90坦克大战是以坦克为题材的射击类小游戏,我们将在java上实现并拓展,我们 ...
- javascript Object.create()究竟发生了什么
这是我在博客园的第一篇博客,早上看了一个大牛的博客,关于javascript继承的,对于大牛使用Object.create()实现继承的方式觉得点问题,就自己研究了一下,所以就有了这篇帖子. 本帖 ...
- R12 AR INVOICE 接口表导入
http://blog.csdn.net/fangz0615/article/details/38677085 Purpose 本文介绍了如何通过AR接口表进行AR事务处理(亦称AR发票)导入. Ap ...
- 8.正则表达式和XPath
1.使用正则表达式爬取内涵段子 import requests import re def loadPage(page): url = "http://www.neihan8.com/art ...