CyclicBarrier的使用:

  假设只有一个场景:每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家都等待。

CountDownLacth使用:

  他经常用于监听某些初始化操作,等初始化执行完毕后,通知主线程继续工作。

下面先看一个CountDownLatch的demo:

 

看一下运行的结果:

假如把t3线程的countDown.countDown();方法注释掉, 那么t1线程就永远都不会结束。

下面看一个cyclicBarrier使用:

同样是看一个demo:

 

我们看一下运行结果:

  

会发现,最后go的时间都是一样的,也就是和最后一个准备完成的时间是一致的;需要注意的是,为什么是3个准备完成进入await的时候,然后一起执行的,是因为这三个里面用的都是同一个CyclicBarrier对象,而且这个对象初始化的时候,传入了3这个数值。加入传的是4,那这三个线程都会一直运行,不会结束。

注意两者的区别:

  CountDownLatch是属于一个线程等待,其他N个线程给那一个线程发送通知,然后这一个线程执行。

  CyclicBarrier是所有线程都是参与阻塞的,在最后一个线程处于等待的时候,那这个时候,所有线程都开始跑自己的线程。

posted on 2017-02-27 16:02  小~虎  阅读(156)  评论(0编辑  收藏  举报