`

多线程 CyclicBarrier

阅读更多

原文:http://blog.csdn.net/qian_348840260/archive/2010/01/23/5247579.aspx

1,一个例子

/**
 * CyclicBarrier维持一个计数器,与CountDownLatch不同的是,等待这个CyclicBarrier的线程必须等到计数器
 * 的某个值时,才可以继续.
 * CyclicBarrier就像它名字的意思一样,可看成是个障碍,所有的线程必须到齐后才能一起通过这个障碍.
 */
/**
 * 本实例实现一个数组相邻元素的加法,一个线程给数组的第一个元素赋值,然后等待其它线程给数组第二个元素赋值,
 * 然后将第一个元素和第二个元素相加.
 */
/**
 * CyclicBarrier的关键技术点如下:
 * 1.构造CyclicBarrier对象时,需要指定计数器的目标值,计数器的初始值为0.
 * 还可以在构造方法中带一个 Runnable参数,表示当计数器到达目标值是,在等待CyclicBarrier的线程被唤醒之前,
 * 指定该Runnable任务.
 * 2.CyclicBarrier的await方法使当前线程进入等待状态,同时将计数器值加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{
				//Random的nextInt(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];
				System.out.println("Result: "+array[2]);
			}
		});
		//启动线程
		new Thread(new ComponentThread(barrier,array,0)).start();
		new Thread(new ComponentThread(barrier,array,1)).start();
	}

	public static void main(String... args){
		CyclicBarrierTest.testCyclicBarrier();
	}
}

 

结果 写道
Componet 0 sleep...
Componet 1 sleep...
testCyclicBarrier run...
Result: 173
Componet 1 awaked...
Component 1 result: 253
Componet 0 awaked...
Component 0 result: 173

 

注意:CyclicBarrier 到达计数后先执行自己的Runnable的方法。如,上面的结果先打印出testCyclicBarrier run... 后awake其他的线程。

 

2,又一个例子

原文:http://www.iteye.com/topic/657295 来自hardPass 的回复的例子也比较好:

 

public class CyclicBarrierTest {
    public static void main(String[] args) throws InterruptedException {   
        ExecutorService exec = Executors.newCachedThreadPool();        
        final CyclicBarrier barrier = new CyclicBarrier(4, new Runnable() {   
            public void run() {   
                System.out.println("好了,大家可以去吃饭了……"  );   
            }   
        });
        System.out.println("要吃饭,必须所有人都到终点,oK?");                   
        System.out.println("不放弃不抛弃!");   
        for (int i = 0; i < 4; i++) {
            exec.execute(new Runnable() {   
                public void run() {   
                    System.out.println(Thread.currentThread().getName() + ":Go");   
                    try {   
                        Thread.sleep((long) (2000 * Math.random()));   
                    } catch (InterruptedException e1) {   
                        e1.printStackTrace();   
                    }   
                    System.out.println(Thread.currentThread().getName()+ ":我到终点了");   
                    try {   
                        barrier.await();   
                    } catch (InterruptedException e) {   
                        e.printStackTrace();   
                    } catch (BrokenBarrierException e) {   
                        e.printStackTrace();   
                    }   
                    System.out.println(Thread.currentThread().getName()   
                            + ":终于可以吃饭啦!");   
                }   
            });   
        }
        exec.shutdown();   
    }
}

 

结果 写道
要吃饭,必须所有人都到终点,oK?
不放弃不抛弃!
pool-1-thread-1:Go
pool-1-thread-3:Go
pool-1-thread-2:Go
pool-1-thread-4:Go
pool-1-thread-2:我到终点了
pool-1-thread-4:我到终点了
pool-1-thread-1:我到终点了
pool-1-thread-3:我到终点了
好了,大家可以去吃饭了……
pool-1-thread-2:终于可以吃饭啦!
pool-1-thread-4:终于可以吃饭啦!
pool-1-thread-1:终于可以吃饭啦!
pool-1-thread-3:终于可以吃饭啦!

 

分享到:
评论

相关推荐

    java多线程之CyclicBarrier的使用方法

    主要介绍了java多线程之CyclicBarrier的使用方法的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下

    CyclicBarrier实现多个线程相互等待的案例(实现累加操作)

    CyclicBarrier实现多个线程相互等待的案例(实现累加操作)

    Java多线程开发之CyclicBarrier

    近研究了一个别人的源码,其中用到多个线程并行操作一个文件,并且在所有线程全部结束后才进行主线程后面的处理。  其用到java.util.concurrent.CyclicBarrier 这个类。  CyclicBarrier是一个同步辅助类,它允许...

    个人总结的深入java多线程开发

    看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...

    CyclicBarrier用法.docx

    CyclicBarrier是Java中的一个同步工具类,用于协调多个线程之间的同步。它的作用类似于CountDownLatch,可以让一个或多个线程等待其他线程执行完毕后再继续执行。 CyclicBarrier可以被看作是一个屏障,当所有线程都...

    JUC多线程学习个人笔记

    JUC(Java Util Concurrent)是Java中用于并发编程的工具包,提供了一组接口和类,用于处理多线程和并发操作。JUC提供了一些常用的并发编程模式和工具,如线程池、并发集合、原子操作等。 JUC的主要特点包括: ...

    【2018最新最详细】并发多线程教程

    【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...

    java多线程开发之通过对战游戏学习CyclicBarrier

    给大家分享了关于java多线程开发中通过对战游戏学习CyclicBarrier的相关知识点内容,有兴趣的朋友们学习参考下。

    Java多线程之并发工具类

     1)CountDownLatch(同步倒数计数器:等待多线程(或者多步骤)完成)  2)CyclicBarrier(循环屏障:同步屏障)  3)Semaphore(信号量:控制并发进程数)  主要参考资料:java并发编程的艺术、Java并发——...

    Java多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask详解

    主要介绍了Java多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    多线程控制的三大安全类封装

    多线程控制的三大安全类:CountDownLatch、CyclicBarrier、Semaphore,这工具包将其封装,可以让初学者更容易学习以及让开发者更容易调用,不需要自己重新编写核心代码。具体事例在源码中。

    JAVA 多线程之信号量(Semaphore)实例详解

    主要介绍了JAVA 多线程之信号量(Semaphore)实例详解的相关资料,需要的朋友可以参考下

    详解java多线程的同步控制

    目录线程安全 Thread Safety重入锁 ReentrantLock读写锁 ReadWriteLock倒计数器 CountDownLatch循环栅栏 CyclicBarrier信号量 Semaphore 线程安全 Thread Safety JMM JMM(Java Memory Model)是一种基于计算机内存...

    JDK自带多线程工具包详解

    由浅入深,通过图解和手写代码,讲解Java版的多线程,主要讲解如下内容: CPU运转机制 线程运行原理及线程状态 AQS原理&源码解读 线程同步+各种锁的原理&手写实现 JDK多线程工具包中,若干种工具的原理和手写实现: ...

    CountDownLatch 和 CyclicBarrier 的运用(含AQS详解)

    CountDownLatch 和 CyclicBarrier 为线程同步的辅助工具,通过它可以做到使一条线程一直阻塞等待,直到其他线程完成其所处理的任务。

    多线程下的并发包:这些面试必问的,你都知道吗?

    在JDK的并发包里提供了几个非常有用的并发容器和并发工具类,供我们在多线程开发中进行使用。 并发包的来历: 在实际开发中如果不需要考虑线程安全问题,大家不需要做线程安全,因为如果做了反而性能不好! 但是开发...

    Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用

    CountDownLatch可以实现一个线程等待多个线程、多个线程等待一个线程、多个线程等待多个线程(这里不涉及)。 我们首先来看看怎么实现一个线程等待多个线程吧。 工厂中,对产品需要进行质检,5个工人进行检查,所有...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【多线程】CyclicBarrier 和 CountDownLatch的不同 88 CountDownLatch 88 CyclicBarrier 89 区别: 89 【多线程】简述synchronized 和java.util.concurrent.locks.Lock的异同? 90 【线程】ThreadLocal的作用 90 ...

    这就是标题—— JUC.pdf

    多线程锁 并发下的集合类 List Set Map Callable接口 线程创建的方式 callable / runnable FutureTask JUC常用辅助类 CountDownLatch (减少计数器) CyclicBarrier(加法计数器) Semaphore(信号量,流量控制) ...

    阿里P7面试题整理集合

    1)多线程(ThreadLocal(问了父子线程怎么共享数据 interitableThreadLocals)、lock和sync区别(问HashMap1.7、1.8区别时带出)、 AQS原理(执行过程源码,入队出队的细节,源码细节)、CountDownLatch和 ...

Global site tag (gtag.js) - Google Analytics