CountDownLatch与CyclicBarrier

CountDownLatch与CyclicBarrier被设计用来进行一组线程协作工作,完成一个或多个阶段的任务,二者有什么区别与联系呢?
1、CountDownLatch
这个用来设置一个屏障点,这个屏障点有好几把锁,每把锁都被开开之后,主线程才能继续往下面执行。
一个李子:3个人去骑行,约定到某个地方集合吃饭,全部到之后老板才上菜。

//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用的比较多。

你可能感兴趣的:(java)