11.5.3线程 同步装置之CyclicBarrier

CyclicBarrier 实战
本文通过实战演示了 Java 并发工具 CyclicBarrier 的使用方法。CyclicBarrier 类似于 CountDownLatch,但允许线程组在继续执行前等待所有线程就位。示例展示了如何利用 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();

}

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值