一、CountDownLatch
1.闭锁。CountDownLatch可以等其他线程完成一些工作后再执行。例如,应用主线程再等框架里面的其他线程加载完一些东西后,再执行就可以使用CountDownLatch
2.CountDownLatch是通过一个计数器实现的,计数器初始值为初始任务数量。每当完成一个任务后,计数器减1(需要调CountDownLatch.countDown()方法),当计数器减为0后,表示所有任务已经完成,然后再闭锁上等待await()方法的线程就会被唤醒,继续执行
**3.注意:**初始任务数量>=CountDownLatch.countDown()线程数,因为一个线程可以多次countDown;调用await()等待的线程可以有多个;线程调用countDown()方法后不代表这个线程就死亡了
二、CyclicBarrier
1.循环使用的屏障。作用就是让多个线程达到一个屏障(同步点)时阻塞,直到最后一个线程到达屏障点后,屏障才会打开,所有线程线程解除阻塞状态继续运行。比如,大家一起去游玩,定了一个聚集地点,必须等到最后一个人到达,所有人才能走。
2.主要方法
(1)CyclicBarrier(int parties)默认构造方法,参数表示等待线程数。每个线程调用await方法告诉CyclicBarrier我已经到达屏障,然后线程阻塞
(2)另外一个构造方法CyclicBarrier(int parties, Runnable barrierAction)。
barrierAction表示所有线程到达屏障后,优先执行的线程,一般用于合并各个线程数据。
三、CountDownLatch和CyclicBarrier
1.CountDownLatch的计数器不可以被重置,CyclicBarrier的计数器可以被重置
2.CountDownLatch是工作线程调用await方法阻塞,别的预备线程执行CountDownLatch.countDown方法。而CyclicBarrier是所有工作线程自行阻塞,等到大家都到后再一起执行
3.CountDownLatch可以不限线程数,就是自定义初始化加载线程数可以不等于实际执行线程数。CyclicBarrier初始化线程数必选等于执行线程数
4.CyclicBarrier提供了一个合并线程