JDK5.0新特性系列---11.5.3线程 同步装置之CyclicBarrier

简介:

import java.util.Random;

import java.util.concurrent.CyclicBarrier;

/**

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

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

*/

/**

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

*/

/**

* CyclicBarrier的关键技术点如下:

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

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

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

*/

public class CyclicBarrierTest {

public static class ComponentThread implements Runnable{

CyclicBarrier barrier;//计数器

int ID;//组件

int[] array; //数据数组

public ComponentThread(CyclicBarrier barrier,int[] array,int ID){

this.barrier = barrier;

this.ID = ID;

this.array = array;

}

public void run(){

try{

//RandomnextInt(int n)方法返回一个[0,n)范围内的随机数

array[ID] = new Random().nextInt(100);

System.out.println("Componet " + ID + " sleep...");

barrier.await();

System.out.println("Componet " + ID + " awaked...");

//计算数据数组中的当前值和后续值

int result = array[ID] + array[ID + 1];

System.out.println("Component " + ID + " result: " + result);

}catch(Exception ex){

}

}

}

/**测试CyclicBarrier的用法*/

public static void testCyclicBarrier(){

final int[] array = new int[3];

CyclicBarrier barrier = new CyclicBarrier(2,new Runnable(){

public void run(){

System.out.println("testCyclicBarrier run...");

array[2] = array[0] + array[1];

}

});

//启动线程

new Thread(new ComponentThread(barrier,array,0)).start();

new Thread(new ComponentThread(barrier,array,1)).start();

}

public static void main(String... args){

CyclicBarrierTest.testCyclicBarrier();

}

}




本文转自远哥博客园博客,原文链接:http://www.cnblogs.com/taven/archive/2011/12/17/2291476.html,如需转载请自行联系原作者

相关文章
|
30天前
|
Java 云计算
Java多线程编程中的同步与互斥机制探析
在当今软件开发领域,多线程编程是一项至关重要的技能。本文将深入探讨Java中的同步与互斥机制,分析其在多线程环境下的应用及实现原理,帮助读者更好地理解并运用这一关键技术。
22 4
|
1月前
|
Python
在Python中,如何保证多个线程之间的同步?
在Python中,如何保证多个线程之间的同步?
22 4
|
1月前
|
Python
如何在Python中实现线程之间的同步和通信?
【2月更文挑战第17天】【2月更文挑战第51篇】如何在Python中实现线程之间的同步和通信?
|
1月前
|
算法 调度 索引
什么是多任务和线程?用线程写的一个udp同步聊天器
什么是多任务和线程?用线程写的一个udp同步聊天器
30 0
|
25天前
|
存储 编解码 算法
【ffmpeg音视频同步】解决ffmpeg音视频中多线程之间的数据同步问题
【ffmpeg音视频同步】解决ffmpeg音视频中多线程之间的数据同步问题
38 2
|
1月前
|
安全 C++ 开发者
【C++多线程同步】C++多线程同步和互斥的关键:std::mutex和相关类的全面使用教程与深度解析
【C++多线程同步】C++多线程同步和互斥的关键:std::mutex和相关类的全面使用教程与深度解析
18 0
|
1月前
|
Java 数据处理
Java8的新特性parallelStream()的概念、对比线程优势与实战
parallelStream() 是 Java 8 中新增的一个方法,它是 Stream 类的一种扩展,提供了将集合数据并行处理的能力。普通的 stream() 方法是使用单线程对集合数据进行顺序处理,而 parallelStream() 方法则可以将集合数据分成多个小块,分配到多个线程并行处理,从而提高程序的执行效率。
43 3
|
1月前
|
存储 Java 数据库连接
线程通信(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)
线程通信(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)
34 0
|
10天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信
|
21天前
|
存储 缓存 NoSQL
Redis单线程已经很快了6.0引入多线程
Redis单线程已经很快了6.0引入多线程
31 3