importjava.util.Random;
importjava.util.concurrent.CyclicBarrier;
/**
*CyclicBarrier维持一个计数器,与CountDownLatch不同的是,等待这个CyclicBarrier的线程必须等到计数器的某个值时,才可以继续.
*CyclicBarrier就像它名字的意思一样,可看成是个障碍,所有的线程必须到齐后才能一起通过这个障碍.
*/
/**
*本实例实现一个数组相邻元素的加法,一个线程给数组的第一个元素赋值,然后等待其它线程给数组第二个元素赋值,然后将第一个元素和第二个元素相加.
*/
/**
*CyclicBarrier的关键技术点如下:
*1.构造CyclicBarrier对象时,需要指定计数器的目标值,计数器的初始值为0.
*还可以在构造方法中带一个Runnable参数,表示当计数器到达目标值是,在等待CyclicBarrier的线程被唤醒之前,指定该Runnable任务.
*2.CyclicBarrier的await方法使当前线程进入等待状态,同时将计数器值加1,当计数器到达目标值时,当前线程被唤醒.
*/
publicclassCyclicBarrierTest {
publicstaticclassComponentThreadimplementsRunnable{
CyclicBarrierbarrier;//计数器
intID;//组件
int[]array;//数据数组
publicComponentThread(CyclicBarrier barrier,int[]
array,intID){
this.barrier= barrier;
this.ID= ID;
this.array= array;
}
publicvoidrun(){
try{
//Random的nextInt(int n)方法返回一个[0,n)范围内的随机数
array[ID] =newRandom().nextInt(100);
System.out.println("Componet "+ID+"
sleep...");
barrier.await();
System.out.println("Componet "+ID+"
awaked...");
//计算数据数组中的当前值和后续值
intresult =array[ID]
+array[ID+ 1];
System.out.println("Component "+ID+"
result: "+ result);
}catch(Exception ex){
}
}
}
/**测试CyclicBarrier的用法*/
publicstaticvoidtestCyclicBarrier(){
finalint[] array =newint[3];
CyclicBarrier barrier =newCyclicBarrier(2,newRunnable(){
publicvoidrun(){
System.out.println("testCyclicBarrier run...");
array[2] = array[0] + array[1];
}
});
//启动线程
newThread(newComponentThread(barrier,array,0)).start();
newThread(newComponentThread(barrier,array,1)).start();
}
publicstaticvoidmain(String...
args){
CyclicBarrierTest.testCyclicBarrier();
}
}
分享到:
相关推荐
升级mac os到10.15时卡在白苹果图标时,将VMare升级到新版(VMware15.5.2)并unlocker,unlocker下载工具(具体使用参考:https://blog.csdn.net/iMatt/article/details/105473200)
HslCommunicationDemo-v11.5.3.zip
sysstat-11.5.3.tar.gz
HslCommunication
tor-browser-11.5.3-android-aarch64-multi.apk.asc.key
《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...
VMware Fusion:适用于Mac的功能强大的简单虚拟机 VMware Fusion使Mac用户可以在Mac上运行Windows以及与Mac应用程序同时运行的数百种其他操作系统,而无需重新启动。 Fusion对于家庭用户而言足够简单,而对于IT专业...
11.4 线程同步 11.4.1 同步概念 11.4.2 同步格式 11.4.3 同步应用 11.5 线程通信 11.5.1 生产者/消费者 11.5.2 共享队列 11.5.3 运行生产者/消费者 11.6 死锁 11.7 本章习题 第12章 异常处理 12.1 异常的...
学生提问:为什么有栈内存和堆内存之分? 93 4.6.2 基本类型数组的初始化 95 4.6.3 引用类型数组的初始化 96 4.6.4 没有多维数组 99 学生提问:我是否可以让图4.13中灰色覆盖的数组元素再次指向另一个数组?这样...
7.1.1 线程同步的过程 193 7.1.2 同步对象 193 7.1.3 等待函数 193 7.2 同步对象示例 194 7.2.1 使用事件对象(Event) 194 7.2.2 使用互斥对象(Mutex) 199 7.2.3 使用信号量控制访问共享数据的线程数量...
JavaScript经典案例集合是送给入门者最好的礼物!是本人精心总结的案例!可以让你迅速上手,物有所值。内容囊括的js的各个方面,而且由浅入深,条例极为清晰,注释丰富。内容:js基础语法;Dom操作;...
☆ 资源说明:☆ [Packt Publishing] VMware vSphere 5 1 开发技巧实例 英文版 [Packt Publishing] VMware vSphere 5 1 Cookbook E Book ☆ 图书概要:☆ Over 130 task oriented recipes to install ...
7.1.1 线程同步的过程 193 7.1.2 同步对象 193 7.1.3 等待函数 193 7.2 同步对象示例 194 7.2.1 使用事件对象(Event) 194 7.2.2 使用互斥对象(Mutex) 199 7.2.3 使用信号量控制访问共享数据的线程数量...