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