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

0 0
原创粉丝点击