CountDownLatch和CyclicBarrier的区别

  在网上看到很多人对于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.csdn.net/kjfcpua/article/details/7300286
http://blog.csdn.net/shihuacai/article/details/8856407

你可能感兴趣的:(java)