【Java 并发编程】CountDownLatch 简介

举报
韩曙亮 发表于 2022/01/11 01:56:42 2022/01/11
【摘要】 文章目录 I CountDownLatch 概念II CountDownLatch 使用流程III CountDownLatch API 简介 I CountDow...



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)

  
 
  • 1
  • ② 参数 int count : 初始计数 ;

2. 计数器递减方法 : 每次调用该方法 , CountDownLatch 对象计数器就会减一 , 如果计数器计数减到 0 , 就会解除其对于线程的阻塞 ;

  • ① 函数原型 :
public void countDown()

  
 
  • 1
  • ② 当前计数大于 0 : 计数 - 1 , 如果减一后的计数为 0 , 那么该 CountDownLatch 对象阻塞的线程就会从阻塞处开始执行 ;
  • ③ 桑倩计数等于 0 : 如果 CountDownLatch 对象的当前的计数是 0 , 那么不作任何操作 ;

3. 无参阻塞方法 : 在线程 A 中调用该方法后 , 调用该方法的线程 , 线程 A 就会被阻塞住 ( 休眠 ) , 在 CountDownLatch 倒计时为 0 之后该阻塞解除 ;

  • ① 函数原型 :
public void await() throws InterruptedException

  
 
  • 1
  • ② 计数为 0 : 如果当前的 CountDownLatch 计数为 0 , 那么阻塞无效 , 继续执行之后的代码 ;
  • ③ 计数大于 0 : 此时调用 await 方法 的线程阻塞 , 处于休眠状态 ;
  • ④ 线程非运行状态 : 如果调用 await 方法的线程处于中断状态 , 或者在等待时被中断 , 抛出 InterruptedException 异常 ;

4. 带参数的阻塞方法 : 在线程 A 中调用该方法后 , 调用该方法的线程 , 线程 A 就会被阻塞住 ( 休眠 ) , 在 CountDownLatch 倒计时为 0 ( 计数 0 ) 或者超出了等待时间 ( 超时 ) 之后该阻塞解除 ; 该方法运行机制与无参类似 , 这里重点说明超时等待机制 ;

  • ① 函数原型 :
public void await(long timeout, TimeUnit unit) throws InterruptedException

  
 
  • 1
  • ② 参数 long timeout : 阻塞操作要等待的最长时间 ;
  • ③ 参数 TimeUnit unit : 等待时长的单位 , 一般是毫秒 ( ms ) ;

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/100587413

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。