CountDownLatch与CyclicBarrier被设计用来进行一组
线程协作工作,完成一个或多个阶段的任务,二者有什么区别与联系呢?
1、CountDownLatch
这个用来设置一个屏障点,这个屏障点有好几把锁,每把锁都被开开之后,主线程才能继续往下面执行。
一个李子:3个人去骑行,约定到某个地方集合吃饭,全部到之后老板才上菜。
class="java" name="code">
//3个人出发,每个人到店之后报告老板
CountDownLatch latch=new CountDownLatch(3);
go(latch);
//全部到店之前,老板一直等着,不上菜
latch.await();
//所有人都到了,老板上菜
serve();
go(CountDownLatch latch){
//第1个人出发,到了后通知老板
latch.countDown();
//第2个人出发,到了后通知老板
latch.countDown();
//第3个人出发,到了后通知老板
latch.countDown();
}
2、CyclicBarrier
CyclicBarrier与CountDownLatch类似,但是可以去完成好几个阶段的任务,比如上述李子,到店吃玩饭后继续出发,到下一个目的地,全部到了之后再吃饭。
此时CyclicBarrier可以完成
循环等待。
//3个人出发,每个人到店之后报告老板
CyclicBarrier cb =new CyclicBarrier(3);
for(...){
//每个人出发
go(cb);
}
//一个人的行程
go(CyclicBarrier cb){
//到达地点1,等待其他人到齐
cb.await();
//都到了吃饭,然后再出发
eat then continue going;
//到达地点2,等待其他人到齐
cb.await();
//都到了吃饭
eat;
}
总结:
CountDownLatch与CyclicBarrier 都是使一组线程协同完成一项任务,而CyclicBarrier 可以循环进行,完成多个阶段的任务(当然也可以用在单个任务的处理),CountDownLatch用的比较多。