`
dowhathowtodo
  • 浏览: 787723 次
文章分类
社区版块
存档分类
最新评论

11.5.3线程 同步装置之CyclicBarrier

 
阅读更多

importjava.util.Random;

importjava.util.concurrent.CyclicBarrier;

/**

*CyclicBarrier维持一个计数器,CountDownLatch不同的是,等待这个CyclicBarrier的线程必须等到计数器的某个值时,才可以继续.

*CyclicBarrier就像它名字的意思一样,可看成是个障碍,所有的线程必须到齐后才能一起通过这个障碍.

*/

/**

*本实例实现一个数组相邻元素的加法,一个线程给数组的第一个元素赋值,然后等待其它线程给数组第二个元素赋值,然后将第一个元素和第二个元素相加.

*/

/**

*CyclicBarrier的关键技术点如下:

*1.构造CyclicBarrier对象时,需要指定计数器的目标值,计数器的初始值为0.

*还可以在构造方法中带一个Runnable参数,表示当计数器到达目标值是,在等待CyclicBarrier的线程被唤醒之前,指定该Runnable任务.

*2.CyclicBarrierawait方法使当前线程进入等待状态,同时将计数器值加1,当计数器到达目标值时,当前线程被唤醒.

*/

publicclassCyclicBarrierTest {

publicstaticclassComponentThreadimplementsRunnable{

CyclicBarrierbarrier;//计数器

intID;//组件

int[]array;//数据数组

publicComponentThread(CyclicBarrier barrier,int[] array,intID){

this.barrier= barrier;

this.ID= ID;

this.array= array;

}

publicvoidrun(){

try{

//RandomnextInt(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();

}

}

分享到:
评论

相关推荐

    VMware15.5.2安装unlocker的darwin11.5.3工具

    升级mac os到10.15时卡在白苹果图标时,将VMare升级到新版(VMware15.5.2)并unlocker,unlocker下载工具(具体使用参考:https://blog.csdn.net/iMatt/article/details/105473200)

    HslCommunicationDemo-v11.5.3.zip

    HslCommunicationDemo-v11.5.3.zip

    sysstat-11.5.3.tar.gz

    sysstat-11.5.3.tar.gz

    HslCommunication11.5.3

    HslCommunication

    tor-browser-11.5.3-android-aarch64-multi.apk.asc.key

    tor-browser-11.5.3-android-aarch64-multi.apk.asc.key

    Linux多线程服务端编程:使用muduo C++网络库

    《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...

    VMware-Fusion-11.5.3-15870345.dmg 适用于Mac的功能强大的简单虚拟机

    VMware Fusion:适用于Mac的功能强大的简单虚拟机 VMware Fusion使Mac用户可以在Mac上运行Windows以及与Mac应用程序同时运行的数百种其他操作系统,而无需重新启动。 Fusion对于家庭用户而言足够简单,而对于IT专业...

    java初学者必看

    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 异常的...

    疯狂JAVA讲义

    学生提问:为什么有栈内存和堆内存之分? 93 4.6.2 基本类型数组的初始化 95 4.6.3 引用类型数组的初始化 96 4.6.4 没有多维数组 99 学生提问:我是否可以让图4.13中灰色覆盖的数组元素再次指向另一个数组?这样...

    精通Windows.API-函数、接口、编程实例.pdf

    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经典案例集合

    JavaScript经典案例集合是送给入门者最好的礼物!是本人精心总结的案例!可以让你迅速上手,物有所值。内容囊括的js的各个方面,而且由浅入深,条例极为清晰,注释丰富。内容:js基础语法;Dom操作;...

    [VMware vSphere] VMware vSphere 5 1 开发技巧实例 英文版

    ☆ 资源说明:☆ [Packt Publishing] VMware vSphere 5 1 开发技巧实例 英文版 [Packt Publishing] VMware vSphere 5 1 Cookbook E Book ☆ 图书概要:☆ Over 130 task oriented recipes to install ...

    精通WindowsAPI 函数 接口 编程实例

    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 使用信号量控制访问共享数据的线程数量...

Global site tag (gtag.js) - Google Analytics