文章目录
- I CountDownLatch 概念
- II CountDownLatch 使用流程
- III CountDownLatch API 简介
I CountDownLatch 概念
1. 概念 : CountDownLatch ( 倒计时锁 ) 是 Java 并发编程中重要的 线程同步辅助工具类 , 其与 join 方法功能类似 , 其可以阻塞住一个或多个线程 , 等待在某些线程中执行想用的操作 , 将 CountDownLatch 倒计时计数到 0 时 , 这些被阻塞的线程才能继续向下执行 ;
2. 作用 : CountDownLatch 可以将一个或多个线程阻塞 , 并在另外一个或多个线程中将 CountDownLatch 计数器减为 0 , 被阻塞的线程解除休眠状态 , 继续执行 ;
II CountDownLatch 使用流程
1. 初始化 CountDownLatch : 初始化 new CountDownLatch ( 8 )
, 在构造函数中 , 为其指定一个初始值 , 从这个值开始倒计时计数 ; 这里设置了 8 计数 , 可以等待另外 8 个线程执行完毕后 , 在执行后续操作 ;
2. 阻塞 : 在若干线程 ( 一个或多个 ) 中调用同一个 CountDownLatch
对象的 await()
方法 , 即可将这些线程阻塞 ;
3. 计数减一 : 在其它非阻塞的线程中 , 执行操作 , 之后调用 CountDownLatch
对象的 countDown()
方法 , 该计数器的计数会减一 , 如果计数减到 0 , 在线程中的阻塞就会解除 ;
4. 阻塞结束 : 当调用 countDown 计数减到 0 之后 , 线程阻塞解除 , 继续执行 await() 方法之后的代码 ;
III CountDownLatch API 简介
1. 构造方法 : 初始化 CountDownLatch 对象 , 传入计数器初始计数 count , 其可以表示阻塞 count 个线程 ;
- ① 函数原型 :
public CountDownLatch(int count)
- ② 参数
int count
: 初始计数 ;
2. 计数器递减方法 : 每次调用该方法 , CountDownLatch 对象计数器就会减一 , 如果计数器计数减到 0 , 就会解除其对于线程的阻塞 ;
- ① 函数原型 :
public void countDown()
- ② 当前计数大于 0 : 计数 - 1 , 如果减一后的计数为 0 , 那么该 CountDownLatch 对象阻塞的线程就会从阻塞处开始执行 ;
- ③ 桑倩计数等于 0 : 如果 CountDownLatch 对象的当前的计数是 0 , 那么不作任何操作 ;
3. 无参阻塞方法 : 在线程 A 中调用该方法后 , 调用该方法的线程 , 线程 A 就会被阻塞住 ( 休眠 ) , 在 CountDownLatch 倒计时为 0 之后该阻塞解除 ;
- ① 函数原型 :
public void await() throws InterruptedException
- ② 计数为 0 : 如果当前的 CountDownLatch 计数为 0 , 那么阻塞无效 , 继续执行之后的代码 ;
- ③ 计数大于 0 : 此时调用 await 方法 的线程阻塞 , 处于休眠状态 ;
- ④ 线程非运行状态 : 如果调用 await 方法的线程处于中断状态 , 或者在等待时被中断 , 抛出 InterruptedException 异常 ;
4. 带参数的阻塞方法 : 在线程 A 中调用该方法后 , 调用该方法的线程 , 线程 A 就会被阻塞住 ( 休眠 ) , 在 CountDownLatch 倒计时为 0 ( 计数 0 ) 或者超出了等待时间 ( 超时 ) 之后该阻塞解除 ; 该方法运行机制与无参类似 , 这里重点说明超时等待机制 ;
- ① 函数原型 :
public void await(long timeout, TimeUnit unit) throws InterruptedException
- ② 参数
long timeout
: 阻塞操作要等待的最长时间 ; - ③ 参数
TimeUnit unit
: 等待时长的单位 , 一般是毫秒 ( ms ) ;