参考文章:http://blog.csdn.net/lmc_wy/article/details/7866863 (闭锁CountDownLatch与栅栏CyclicBarrier)
所有线程互相等待,直到大家都到达一个水平线上,大家在继续运行,这个水平线就是栅栏。
栅栏:一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点。利用栅栏,可以使线程相互等待,直到所有线程都到达某一点,然后栅栏将打开,所有线程将通过栅栏继续执行。CyclicBarrier支持一个可选的 Runnable
参数,当线程通过栅栏时,runnable对象将被调用。构造函数CyclicBarrier(int parties, Runnable barrierAction)
,当线程在CyclicBarrier对象上调用await()
方法时,栅栏的计数器将增加1,当计数器为parties
时,栅栏将打开。
import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class CyclicBarrierTest { public static void main(String[] args) { final int count = 5; final CyclicBarrier barrier = new CyclicBarrier(count, new Runnable() { @Override public void run() { System.out.println("大家都跑完了!"); } }); for (int i = 0; i < count; i++) { new Thread(new Worker(i, barrier)).start(); } } } class Worker implements Runnable { final int id; final CyclicBarrier barrier; public Worker(final int id, final CyclicBarrier barrier) { this.id = id; this.barrier = barrier; } @Override public void run() { try { System.out.println(this.id + "starts to run !"); Thread.sleep((long) (Math.random() * 10000)); System.out.println(this.id + "arrived !"); this.barrier.await(); //跑到这个地方等待 System.out.println(this.id+"--end--time:{"+System.currentTimeMillis()+"}"); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } }
运行结果:
0starts to run ! 1starts to run ! 2starts to run ! 3starts to run ! 4starts to run ! 1arrived ! 4arrived ! 3arrived ! 0arrived ! 2arrived ! 大家都跑完了! 2--end--time:{1469688224243} 1--end--time:{1469688224243} 3--end--time:{1469688224243} 4--end--time:{1469688224243} 0--end--time:{1469688224243}
再来一个例子,从线程池拿5个线程,这些线程启动后同时去干一件事情,用CyclicBarrier实现
public static void main(String[] args) { final CyclicBarrier barrier=new CyclicBarrier(5); ExecutorService service= Executors.newFixedThreadPool(5); for(int i=0;i<5;i++){ service.execute(new Runnable() { @Override public void run() { try { long wait=(long)(Math.random()*10000); System.out.println(wait); Thread.sleep(wait); //模拟线程启动耗时 barrier.await(); //等待大家都启动 System.out.println("start time :"+System.currentTimeMillis()); //大家同时开始干活 } catch (Exception e) { e.printStackTrace(); } } }); } }
相关推荐
主要介绍了java多线程之CyclicBarrier的使用方法的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时CyclicBarrier很有用。因为该barrier在释放等待...
主要介绍了Java并发实例之CyclicBarrier的使用,涉及CyclicBarrier的介绍,以及相关的并发实例,具有一定参考价值,需要的朋友可以了解下。
1.2 CyclicBarrier概述 CyclicBarrier的基本用法 2.1 创建CyclicBarrier对象 2.2 await()方法 控制线程协作数量 3.1 场景介绍 3.2 使用CyclicBarrier控制线程协作 循环使用CyclicBarrier 4.1 场景介绍 4.2 使用...
主要为大家详细分析了Java并发系列之CyclicBarrier源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
CyclicBarrier是Java中的一个同步工具类,用于协调多个线程之间的同步。它的作用类似于CountDownLatch,可以让一个或多个线程等待其他线程执行完毕后再继续执行。 CyclicBarrier可以被看作是一个屏障,当所有线程都...
主要介绍了详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用,其相当于一个屏障,当一个线程跑到await()方法时,将挂起这个线程,等待直到其他线程同样跑这个await()方法。...
CyclicBarrier和CountDownLatch一样,都是关于线程的计数器。用法略有不同,测试代码如下:
CyclicBarrier类似于CountDownLatch也是个计数器,不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数,当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续...
主要介绍了java CyclicBarrier的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
《java并发编程》中CountDownLatch和CyclicBarrier用法实例大全,几乎包含了所有重要的用法
java并发编程中CountDownLatch和CyclicBarrier的使用.pdf
CyclicBarrier的使用以及注意事项
java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf
主要介绍了Java并发编程之栅栏(CyclicBarrier)实例介绍,栅栏类似闭锁,但是它们是有区别的,需要的朋友可以参考下
主要介绍了Java并发编程(CyclicBarrier)实例详解的相关资料,JAVA编写并发程序的时候,我们需要仔细去思考一下并发流程的控制,如何让各个线程之间协作完成某项工作。
CyclicBarrier实现多个线程相互等待的案例(实现累加操作)