CyclicBarrier学习
来源:互联网 发布:青岛数据分中心 编辑:程序博客网 时间:2024/05/21 18:07
package com.sgcc.uds.search.mq;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;//CyclicBarrier类似于CountDownLatch也是个计数器, 不同的是CyclicBarrier数的是调用了//CyclicBarrier.await()进入等待的线程数, 当线程数达到了CyclicBarrier初始时规定的数目时,//所有进入等待状态的线程被唤醒并继续。 CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的//线程必须到齐后才能一起通过这个障碍。 CyclicBarrier初始时还可带一个Runnable的参数,此Runnable//任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。public class CyclicBarrierTest {public static void main(String[] args) {ExecutorService service = Executors.newCachedThreadPool();final CyclicBarrier cb = new CyclicBarrier(3); // 三个线程同时到达for (int i = 0; i < 3; i++) {Runnable runnable = new Runnable() {public void run() {try {Thread.sleep((long) (Math.random() * 10000));System.out.println("线程"+ Thread.currentThread().getName()+ "即将到达集合地点1,当前已有"+ (cb.getNumberWaiting() + 1)+ "个已到达,"+ (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊": "正在等候"));try {cb.await();} catch (BrokenBarrierException e) {e.printStackTrace();}Thread.sleep((long) (Math.random() * 10000));System.out.println("线程"+ Thread.currentThread().getName()+ "即将到达集合地点2,当前已有"+ (cb.getNumberWaiting() + 1)+ "个已到达,"+ (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊": "正在等候"));try {cb.await();} catch (BrokenBarrierException e) {e.printStackTrace();}Thread.sleep((long) (Math.random() * 10000));System.out.println("线程"+ Thread.currentThread().getName()+ "即将到达集合地点3,当前已有"+ (cb.getNumberWaiting() + 1)+ "个已到达,"+ (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊": "正在等候"));try {cb.await();} catch (BrokenBarrierException e) {e.printStackTrace();}} catch (InterruptedException e) {e.printStackTrace();}}};service.execute(runnable);}service.shutdown();}}
import java.util.Random;import java.util.concurrent.CyclicBarrier;/** * CyclicBarrier类似于CountDownLatch也是个计数器, * 不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数, * 当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续。 * CyclicBarrier就象它名字的意思一样,可看成是个障碍, * 所有的线程必须到齐后才能一起通过这个障碍。 * CyclicBarrier初始时还可带一个Runnable的参数, * 此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。 */public class CyclicBarrierTest2 {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 {array[ID] = new Random().nextInt(100);System.out.println("Component " + ID + " generates: " + array[ID]);// 在这里等待Barrier处System.out.println("Component " + ID + " sleep...");barrier.await();System.out.println("Component " + 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() {// 在所有线程都到达Barrier时执行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) {CyclicBarrierTest2.testCyclicBarrier();}}
Component 1 sleep...
Component 0 generates: 21
Component 0 sleep...
testCyclicBarrier run...
Component 0 awaked...
Component 0 result: 76
Component 1 awaked...
Component 1 result: 131
0 0
- CyclicBarrier学习
- CyclicBarrier学习
- Java多线程CyclicBarrier学习
- JDK学习-CountDownLatch/CyclicBarrier
- JAVA concurrent包学习--CyclicBarrier
- Java中CyclicBarrier使用学习
- cyclicBarrier
- CyclicBarrier
- CyclicBarrier
- CyclicBarrier
- CyclicBarrier
- CyclicBarrier
- CyclicBarrier
- CyclicBarrier
- CyclicBarrier
- CyclicBarrier
- cyclicBarrier
- CyclicBarrier
- tornado 模板輸出被转义的问题
- 2014 -> 2015
- 个人总结面试题目三
- PeopleRank从社交网络中发现个体价值
- linux 网络编程 I/O复用 select,poll ,epoll
- CyclicBarrier学习
- anroid 内核编译
- java引擎(libGDX开发教程(50))
- android permission 与 uses-permission 的区别
- LA3942字典树+递推
- 天声人語 20150101
- 12306泄露信息查询工具 12306回应信息泄露
- android broadcast 广播机制对短信处理 获取短信内容
- ACdream群OJ 1063 字典树的运用