在网上看到很多人对于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计数器减为0
cd.await();
//cb.await();
System.out.println("线程名称"+Thread.currentThread().getId());
} catch (Exception e) {
// TODO Auto-generated catch block
e.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 block
e.printStackTrace();
}
}
});
System.out.println("hello countdownlatch……");
}
}
}
参考文章:
http://blog.youkuaiyun.com/kjfcpua/article/details/7300286
http://blog.youkuaiyun.com/shihuacai/article/details/8856407