CountDownLatch VS CyclicBarrier 
  • CountDownLatch 的计数器只能使用一次,而 CyclicBarrier 的计数器可以反复使用
  • 在控制多个线程同时运行上,CountDownLatch 可以不限线程数量,而 CyclicBarrier 是固定线程数。
  • CyclicBarrier 还可以????供一个 barrierAction(优先执行这个action),合并多线程计算结果

 

CountDownLatch

CountDownLatch 功能

闭锁,CountDownLatch 这个类能够使一个线程等待其他线程完成各自的工作后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动 所有的框架服务之后再执行。

CountDownLatch 是通过一个计数器来实现的,计数器的初始值为初始任务的数量。每当完成了一个任务后,计数器的值就会减 1 (CountDownLatch.countDown()方法)。当计数器值到达 0 时,它表示所有的已 经完成了任务,然后在闭锁上等待 CountDownLatch.await()方法的线程就可以恢 复执行任务

 

CountDownLatch 的计数器只能使用一次

 

CountDownLatch 图解

TW1, TW2 两个线程在执行到某个节点时,调用了CountDownLatch.await()方法,表示在该闭锁上等待。这里假设闭锁初始化值为5。

Ta,Tb,Tc,Td 四个线程会去调用CountDownLatch.countDown()方法,可以看到:

  • 一个线程多次调用countDown()方法
  • 一个线程调用countDown()方法后,可以继续运行,可以死亡

 

Java 多线程 - CountDownLatch & CyclicBarrier_构造函数

 

 

 

CyclicBarrier

CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做 的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一 个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。 

  • CyclicBarrier 默认的构造方法是 CyclicBarrier(int parties),其参数表示屏障拦截 的线程数量,每个线程调用 await 方法告诉 CyclicBarrier 我已经到达了屏障,然 后当前线程被阻塞。
  • CyclicBarrier 还????供一个更高级的构造函数 CyclicBarrie(r int parties,Runnable barrierAction),用于在线程到达屏障时,优先执行 barrierAction,方便处理更复杂的业务场景。

CyclicBarrier 可以用于多线程计算数据,最后合并计算结果的场景。

 

 

Java 多线程 - CountDownLatch & CyclicBarrier_初始化_02