Java并发工具包——CountDownLatch
感兴趣的朋友希望能留言交流,有好的建议可以提出来,大家一起进步多谢。
这期内容是之前的Zookeeper入门中挖的一个坑,为什么在实现Java连接Zookeeper服务的时候,使用了这个工具类。具体的原因是什么呢?这期文章来详细的解释一下这个类。
简介
CountDownLatch是java在并发场景中一个常用的类,这个类在java1.5版本发布的,为了实现若干线程等待其他线程执行结束之后继续执行。在Java面试中也是比较常考的一个知识点。
应用场景
- 大文件处理
大文件分片处理的时候,为了更好的利用资源那么多线程的方式来完成大文件分片的处理,那么主线程通过await的方法来等待各个线程执行完成,然后主线程再进行文件校验等后续操作。 - 异步服务连接的场景(可以考虑Zookeeper客户端连接的方案)
参考Zookeeper入门的文章中,服务端连接的方式。 - 比赛成绩核算程序
一场比赛成绩的核算需要在各个选手(每个选手可以看成一个线程)都进行完成之后才能核算最后的比赛结果。 - 任务进度条程序
一个耗时较长的任务,需要通过异步的方式来完成,而且又需要通过主线程或守护线程来监控各个线程的完成情况,通过这个类实现就比较简单。
使用例子
进度条
![](https://img.haomeiwen.com/i2307987/2560d249231660e1.png)
成绩核算
![](https://img.haomeiwen.com/i2307987/5aa2edaf466ee1d0.png)
实现原理
CountDownLatch是使用一个计数器来实现的,计数器的初始值为线程数量。每当一个线程完成了自己的任务后,计数器的值就会减一直到为零时,await的线程才会继续执行。
![](https://img.haomeiwen.com/i2307987/13d2dea55829b8bb.png)
主线程通过await方法阻塞自己,之后其他各个线程的执行完毕后会通知主线程继续执行。
CountDownLatch内部通过一个静态的同步类完成计数功能,这个数字只能通过构造函数在最初创建对象的时候传入,没有其他办法通过外界方法调用进行修改,只能由各个线程中调用countDown方法来实现数量的减一,这样就能保证所有的线程都成功执行之后,主线程才可以继续执行。
常见面试的问题
- 解释CountDownLatch的概念?
- 给出CountDownLatch的使用场景?
- CountDownLatch类中常用的方法?
网友评论