1,CountdownLatch适用于所有线程执行结束后了(指定的事件都发生了),放开*,目标事件(线程)执行。例如:我制作一个汽车,每个零件的制作是一个进程,组装是一个进程,需要等到所有的零件制作进程执行结束,才会触发将汽车组装进程。
而CyclicBarrier则适合让所有线程在同一点同时执行,例如:运动员需要都集合准备好,才能开跑,开跑后,所有的运动员一起跑步
2,CountdownLatch利用继承AQS的共享锁来进行线程的通知,利用CAS来进行--,而CyclicBarrier则利用ReentrantLock的Condition来阻塞和通知线程
示例代码
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.TimeUnit; public class JucTest9 { public static void main(String[] args) throws Exception { //cyclicBarrierTest(); countDownLatchTest(); } static void cyclicBarrierTest()throws Exception { CyclicBarrier cyclicBarrier = new CyclicBarrier(4,()->{ System.out.println("4人组集合完毕,开枪"); }); for(int i=1;i<=4;i++){ new Thread(()-> { System.out.println(Thread.currentThread().getName()+"到队集合,等待跑步出发"); try { cyclicBarrier.await(); System.out.println(Thread.currentThread().getName()+"跑步"); }catch (Exception e) { e.printStackTrace(); } },"A"+i).start(); } } static void countDownLatchTest() throws Exception { //指定一个数值进行是、计数,使用await()进行等待计算器归零后,继续向下执行 CountDownLatch countDownLatch = new CountDownLatch(4); for(int i=1;i<=4;i++){ new Thread(()-> { System.out.println(Thread.currentThread().getName()+"汽车零件开始准备"); countDownLatch.countDown(); System.out.println(Thread.currentThread().getName()+"汽车零件准备完成"); },"A"+i).start(); } countDownLatch.await(); System.out.println("汽车进行组装"); } }