CountDownLatch 类的使用

今天我们来学习一下CountDownLatch这个类,这是个非常方便的同步计数控制类,我们先来看一下这种场景:
发布朋友圈流程
当然这只是一种方式,现在微信采用了先显示本地数据,然后上传后再更新,这里是模拟上传完再显示的方式。
好了,我们来解读一下这个图:
1. 用户要发布图片朋友圈,选择好图片后,显示成这样:
发布朋友圈界面
2. 点击发布按钮,开始多线程上传图片,并获取对应服务器上的地址。
3. 所有图片上传完成后,然后把URL组成List,然后再加上文本内容,组成一个post完成发布。

那问题来了,第二步该如果做到同时上传好几张,然后还能全部上传后,第三步可以一下发布出去呢?
当然问题解法有很多,这里就来介绍一种实现方式,使用CountDownLatch来实现。
先来看一下这个类的说明:

A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.

大体意思是说,这个类允许一个或多个线程 一直等到其他线程完成一组操作后 再开始执行。
通过定义,我们应该可以感觉到这个正好符合我们现在的这种需求。
那我们如何使用呢?
再来看一下里面的文档:

A CountDownLatch is initialized with a given count. The await methods block until the current count reaches zero due to invocations of the countDown() method, after which all waiting threads are released and any subsequent invocations of await return immediately. This is a one-shot phenomenon – the count cannot be reset. If you need a version that resets the count, consider using a CyclicBarrier.

上面的文档就不翻译了,直接用我们的代码来模拟解释一下吧~

CountDownLatch cdl = new CountDownLatch(4);//默认值为4,代表要完成4个任务后才可继续执行
startDoTask();//负责上传4个媒体文件,图片音视频等
cdl.await();//开始阻塞,等待上面的任务全部完成
publish();//发布

startDoTask里面负责4个图片上传,每上传成功一个,调用一下cdl.countDown(); 进行计数减一,当减到0的时候,代表了4个图片都已经上传成功了,然后上面cdl.await(); 不再阻塞,程序开始继续执行publish.
我们把上面的过程整理成图片看一下:
任务示意图
这下我们就可以实现我们想要的,而且代码看起来非常简洁,有兴趣的建议看看源码如何实现的~

原文地址:http://blog.csdn.net/yk3372/article/details/53150444

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值