CountDownLatch与CyclicBarrier被设计用来进行一组线程协作工作,完成一个或多个阶段的任务,二者有什么区别与联系呢?
[b][size=large]1、CountDownLatch[/size][/b]
这个用来设置一个屏障点,这个屏障点有好几把锁,每把锁都被开开之后,主线程才能继续往下面执行。
一个李子:3个人去骑行,约定到某个地方集合吃饭,全部到之后老板才上菜。
[b][size=large]2、CyclicBarrier[/size][/b]
CyclicBarrier与CountDownLatch类似,但是可以去完成好几个阶段的任务,比如上述李子,到店吃玩饭后继续出发,到下一个目的地,全部到了之后再吃饭。
此时CyclicBarrier可以完成循环等待。
[size=large][b]总结:[/b][/size]
CountDownLatch与CyclicBarrier 都是使一组线程协同完成一项任务,而CyclicBarrier 可以循环进行,完成多个阶段的任务(当然也可以用在单个任务的处理),CountDownLatch用的比较多。
[b][size=large]1、CountDownLatch[/size][/b]
这个用来设置一个屏障点,这个屏障点有好几把锁,每把锁都被开开之后,主线程才能继续往下面执行。
一个李子:3个人去骑行,约定到某个地方集合吃饭,全部到之后老板才上菜。
//3个人出发,每个人到店之后报告老板
CountDownLatch latch=new CountDownLatch(3);
go(latch);
//全部到店之前,老板一直等着,不上菜
latch.await();
//所有人都到了,老板上菜
serve();
go(CountDownLatch latch){
//第1个人出发,到了后通知老板
latch.countDown();
//第2个人出发,到了后通知老板
latch.countDown();
//第3个人出发,到了后通知老板
latch.countDown();
}
[b][size=large]2、CyclicBarrier[/size][/b]
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;
}
[size=large][b]总结:[/b][/size]
CountDownLatch与CyclicBarrier 都是使一组线程协同完成一项任务,而CyclicBarrier 可以循环进行,完成多个阶段的任务(当然也可以用在单个任务的处理),CountDownLatch用的比较多。
本文详细对比了CountDownLatch与CyclicBarrier两种并发控制工具的特点及使用场景。CountDownLatch用于设置一个屏障点,当所有线程到达该点后主线程才能继续执行;而CyclicBarrier则允许线程组多次等待,适用于需要经历多个阶段的并发任务。
1079

被折叠的 条评论
为什么被折叠?



