问题描述
我知道 CountDownLatch使一个或多个线程等待其他线程,CylicBarrier使所有线程相互等待但是完全可以使用CountDownLatch替代CyliBarrier的啊package Thread;import java.util.concurrent.CountDownLatch;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);cd.countDown();//这样貌似和CylicBarrier一个效果啊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();}}书上说CylicBarrier可以重复使用,CountDownLatch只能用一次,这个一直看不明白啊?求高手解决
解决方案
首先,CyclicBarrier可以多次使用,CountDownLatch只能用一次(为0后不可变)其次,Barrier是等待指定数量线程到达再继续处理;Latch是等待指定事件变为指定状态后发生再继续处理,对于CountDown就是计数减为0的事件,但你也可以实现或使用其他Latch就不是这个事件了...Barrier是等待指定数量任务完成,Latch是等待其他任务完成指定状态的改变再继续。。。
解决方案二:
区别在于cycle use。CountDownLatch 只能触发一次,计数值不能被重置。CyclicBarrier可以多次重复使用