日期:2014-05-20  浏览次数:20830 次

问个并发的问题:CyclicBarrier和CountDownLatch的区别
我知道CyclicBarrier使多个线程互相等待,CountDownLatch使一个线程或多个线程等待其他线程,但是那不是CountDownLatch完全可以替代CyclicBarrier了,代码如下:
Java code

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class line3 implements Runnable{
    private CountDownLatch cd;
    private int id;
    public line3(CountDownLatch cd,int id){
        this.cd=cd;
        this.id=id;
    }
    public void run() {
            try {
                TimeUnit.MILLISECONDS.sleep(id*1000);//doSomeThing...
                cd.countDown();//这样子不是和CyclicBarrier效果一样...
                System.out.println("countDown"+id);
                cd.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("line3  "+id);
    }
    public static void main(String[] args) {
        CountDownLatch cd=new CountDownLatch(10);
        ExecutorService es=Executors.newCachedThreadPool();
        
        for (int i = 0; i < 10; i++) {
            es.execute(new line3(cd,i));
        }
        es.shutdown();
    }
}


另外书上说:CountDownLatch只触发一次,CylicBarrier可以触发多次,看不大明白,求高手通俗点的解释..或者给个例子也行..

------解决方案--------------------
我认为这两个同步器的区别在 API 的文档中已经说明得很清楚了。

CyclicBarrier(循环障栅)从名字中就可以看出来是可以循环使用的。
CountDownLatch(倒计数门闩)顾名思义就是倒计数器,应该没有再来一次的倒计数器吧,哈哈。