CyclicBarrier的使用:
假设只有一个场景:每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家都等待。
CountDownLacth使用:
他经常用于监听某些初始化操作,等初始化执行完毕后,通知主线程继续工作。
下面先看一个CountDownLatch的demo:
看一下运行的结果:
假如把t3线程的countDown.countDown();方法注释掉, 那么t1线程就永远都不会结束。
下面看一个cyclicBarrier使用:
同样是看一个demo:
我们看一下运行结果:
会发现,最后go的时间都是一样的,也就是和最后一个准备完成的时间是一致的;需要注意的是,为什么是3个准备完成进入await的时候,然后一起执行的,是因为这三个里面用的都是同一个CyclicBarrier对象,而且这个对象初始化的时候,传入了3这个数值。加入传的是4,那这三个线程都会一直运行,不会结束。
注意两者的区别:
CountDownLatch是属于一个线程等待,其他N个线程给那一个线程发送通知,然后这一个线程执行。
CyclicBarrier是所有线程都是参与阻塞的,在最后一个线程处于等待的时候,那这个时候,所有线程都开始跑自己的线程。