Java并发工具包——CountDownLatch

Java并发工具包——CountDownLatch

感兴趣的朋友希望能留言交流,有好的建议可以提出来,大家一起进步多谢。

这期内容是之前的Zookeeper入门中挖的一个坑,为什么在实现Java连接Zookeeper服务的时候,使用了这个工具类。具体的原因是什么呢?这期文章来详细的解释一下这个类。

简介

CountDownLatch是java在并发场景中一个常用的类,这个类在java1.5版本发布的,为了实现若干线程等待其他线程执行结束之后继续执行。在Java面试中也是比较常考的一个知识点。

应用场景

  • 大文件处理
    大文件分片处理的时候,为了更好的利用资源那么多线程的方式来完成大文件分片的处理,那么主线程通过await的方法来等待各个线程执行完成,然后主线程再进行文件校验等后续操作。
  • 异步服务连接的场景(可以考虑Zookeeper客户端连接的方案)
    参考Zookeeper入门的文章中,服务端连接的方式。
  • 比赛成绩核算程序
    一场比赛成绩的核算需要在各个选手(每个选手可以看成一个线程)都进行完成之后才能核算最后的比赛结果。
  • 任务进度条程序
    一个耗时较长的任务,需要通过异步的方式来完成,而且又需要通过主线程或守护线程来监控各个线程的完成情况,通过这个类实现就比较简单。

使用例子

进度条

《Java并发工具包——CountDownLatch》 ProcessBar

成绩核算

《Java并发工具包——CountDownLatch》 Competition

实现原理

CountDownLatch是使用一个计数器来实现的,计数器的初始值为线程数量。每当一个线程完成了自己的任务后,计数器的值就会减一直到为零时,await的线程才会继续执行。

《Java并发工具包——CountDownLatch》 CountDownLatch

主线程通过await方法阻塞自己,之后其他各个线程的执行完毕后会通知主线程继续执行。
CountDownLatch内部通过一个静态的同步类完成计数功能,这个数字只能通过构造函数在最初创建对象的时候传入,没有其他办法通过外界方法调用进行修改,只能由各个线程中调用countDown方法来实现数量的减一,这样就能保证所有的线程都成功执行之后,主线程才可以继续执行。

常见面试的问题

  • 解释CountDownLatch的概念?
  • 给出CountDownLatch的使用场景?
  • CountDownLatch类中常用的方法?
    原文作者:icyage
    原文地址: https://www.jianshu.com/p/c031e884c2eb
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞