CountDownLatch和CyclicBarrier的区别
来源:互联网 发布:Linux 进程监控 编辑:程序博客网 时间:2024/05/07 15:27
在网上看到很多人对于CountDownLatch和CyclicBarrier的区别简单理解为CountDownLatch是一次性的,而CyclicBarrier在调用reset之后还可以继续使用。那如果只是这么简单的话,我觉得CyclicBarrier简单命名为ResetableCountDownLatch好了,显然不是的。
CountDownLatch: A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.
CountDownLatch:一种同步帮助,允许一个或多个线程等待直到在其他线程中执行的一组操作完成。
CyclicBarrier: A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point.
CyclicBarrier:一种同步辅助装置,允许一组线程彼此等待,以达到共同的阻挡点。
总结和个人理解:
CountDownLatch:一个线程(或者多个),等待另外一个或N个线程完成某个事情之后才能执行。
CyclicBarrier:N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。
这样应该就清楚一点了,对于CountDownLatch来说,重点是那个“一个线程”, 是它在等待, 而另外那N的线程在把“某个事情”做完之后可以继续等待,可以终止。而对于CyclicBarrier来说,重点是那N个线程,他们之间任何一个没有完成所有的线程都必须等待。
即CountDownLatch是一个或N个线程在等待“另一类的”一个,而CyclicBarrier是“一类”中的N个相互等待。
代码理解:
CountDownLatch:
package com.test1.zookeeper;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CountDownLatch;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** *@author WHD *data 2017年4月9日 */public class Test2 {public static void main(String[] args) throws InterruptedException, BrokenBarrierException {ExecutorService executeService = Executors.newFixedThreadPool(5);final CountDownLatch cd = new CountDownLatch(5);final CyclicBarrier cb = new CyclicBarrier(5); for(int i =0;i<5;i++){System.out.println("i:"+i);executeService.execute(new Runnable(){public void run(){try {//阻塞子线程,直到CountDownLatch计数器减为0cd.await();//cb.await();System.out.println("线程名称"+Thread.currentThread().getId());} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}});cd.countDown();System.out.println("hello countdownlatch……");}}}这个个人理解就是子线程在等待CountDownLatch这个计数器,或者说子线程在等待驱动Main方法的线程完成它的任务!
CyclicBarrier:
package com.test1.zookeeper;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** *@author WHD *data 2017年4月9日 */public class Test2 {public static void main(String[] args) throws InterruptedException, BrokenBarrierException {ExecutorService executeService = Executors.newFixedThreadPool(5);final CyclicBarrier cb = new CyclicBarrier(5); for(int i =0;i<5;i++){System.out.println("i:"+i);executeService.execute(new Runnable(){public void run(){try {//五个子线程相互等待,等都到齐了才开始运行!cb.await();System.out.println("线程名称"+Thread.currentThread().getId());} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}});System.out.println("hello countdownlatch……");}}}
参考文章:
http://blog.csdn.net/kjfcpua/article/details/7300286
http://blog.csdn.net/shihuacai/article/details/8856407
- CountDownLatch和CyclicBarrier的区别
- CountDownLatch和CyclicBarrier的区别
- CountDownLatch和CyclicBarrier的区别
- CountDownLatch和CyclicBarrier的区别
- CountDownLatch和CyclicBarrier的区别
- CountDownLatch和CyclicBarrier的区别
- CountDownLatch和CyclicBarrier的区别
- CountDownLatch和CyclicBarrier的区别
- CountDownLatch和CyclicBarrier的区别
- CountDownLatch和CyclicBarrier的区别
- CyclicBarrier和CountDownLatch的区别
- CyclicBarrier和CountDownLatch的区别
- CountDownLatch和CyclicBarrier的区别
- CountDownLatch和CyclicBarrier的区别
- CountDownLatch和CyclicBarrier的区别
- CyclicBarrier和CountDownLatch的区别
- CyclicBarrier和CountDownLatch区别
- CyclicBarrier和CountDownLatch区别
- 1588
- 不是流形的例子
- android开发经常用到的获取各种系统路径的方法
- 求完全二叉树的节点数 时间复杂度小于O(N)
- C++11 新特性总结
- CountDownLatch和CyclicBarrier的区别
- LeetCode 45 Jump Game II 题解
- java设计模式六大原则(5):迪米特法则
- Servlet的生命周期
- Android使用URLConnection实现post和get
- Android中使用NativeActivity进行APP开发
- MySQL中的Cascade,NO ACTION,Restrict,SET NULL
- 开源的GIS
- 约束理论的聚焦五步骤