我知道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(倒计数门闩)顾名思义就是倒计数器,应该没有再来一次的倒计数器吧,哈哈。