Java并发包concurrent之CountDownLatch

来源:互联网 发布:黑马程序员骗了我 编辑:程序博客网 时间:2024/04/29 12:31
   CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。换句话说,你可以并行的执行一段代码,并设置等待所有的线程都执行完的点,然后再一起开始执行。举例说,五个个人一起(并行)包饺子,只有等所有的饺子都包好以后才一起下锅,就这个意思咯。

其API相对来说比较简单:

构造方法:

CountDownLatch(int count)  

构造一个用给定计数初始化的 CountDownLatch 。

成员方法:

void await() 
使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。
boolean await(long timeout, TimeUnit unit) 
使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。
void countDown() 
递减锁存器的计数,如果计数到达零,则释放所有等待的线程。
long getCount() 
返回当前计数。
String toString() 
返回标识此锁存器及其状态的字符串。

下面我们来举一个例子,演示一下CountDownLatch的使用。

假如有两个工人都要每人都要完成一项工作,工人1需要5秒,工人2需要3秒,那么两个人并行开始工作,在相同的资源下,计算2个任务都花费的总时间,我们就可以使用CountDownLatch来等待2个工人都完成来计算时间。我们来用代码模拟一下:

工人1:

package cn.slimsmart.java.demo.concurrent;import java.util.concurrent.CountDownLatch;public class Worker1 implements Runnable{private CountDownLatch latch;public Worker1(CountDownLatch latch){this.latch =latch;}@Overridepublic void run() {System.out.println("工人1开始工作");try {System.out.println("工作中...");Thread.currentThread().sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}latch.countDown();System.out.println("工人1完成工作");}}
工人2:

package cn.slimsmart.java.demo.concurrent;import java.util.concurrent.CountDownLatch;public class Worker2 implements Runnable{private CountDownLatch latch;public Worker2(CountDownLatch latch){this.latch =latch;}@Overridepublic void run() {System.out.println("工人2开始工作");try {System.out.println("工作中...");Thread.currentThread().sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}latch.countDown();System.out.println("工人2完成工作");}}
计算花费时间:

package cn.slimsmart.java.demo.concurrent;import java.util.concurrent.CountDownLatch;public class CostTime {public static void main(String[] args) throws InterruptedException {CountDownLatch latch=new CountDownLatch(2);//两个线程并行long time = System.currentTimeMillis();new Thread(new Worker1(latch)).start();new Thread(new Worker2(latch)).start();latch.await();System.out.println("总共花费时间:"+(System.currentTimeMillis()-time)+"ms");}}
运行结果:

工人1开始工作工作中...工人2开始工作工作中...工人2完成工作工人1完成工作总共花费时间:5011ms

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 香香鞋上的饰品老掉怎么办 联壁金融资金冻结提现不出来怎么办 联壁金融提现不到帐怎么办 联壁金融提现迟迟不到帐怎么办 客户说平安福现金价值低怎么办 2个月宝宝肚脐凸出来怎么办 西安华润万家预付卡丢了怎么办 租房签了一年合同想走怎么办 京东寄包裹在速递易里面该怎么办 翼码科技辅助码被删掉了怎么办 用别人的身份证注册的手机号怎么办 大v线做到假线了怎么办 有个摄像头网段不同搜不到怎么办 百度网盘离线下载有违规内容怎么办 抖音上传的照片与音乐不同步怎么办 社保卡里面的钱用完了怎么办 医保卡里面的钱用完了怎么办 手机通知栏变成了搜索栏怎么办 小米手机账号密码忘了手机号怎么办 暑假工没签合同押工资了的怎么办 在日本雅虎拍卖网站买到假货怎么办 没有百度糯米账号但是买票了怎么办 拼多多商家版登陆密码忘记了怎么办 安卓下载的软件闪退怎么办 老司机影视院开通会员看不了怎么办 梦幻西游手游苹果手机打不开怎么办 拼多多笔订单被判定虚假发货怎么办 苹果手机微信接收不到信息怎么办 内衣穿32太小穿34空杯怎么办 楼下的把下水管道堵死了怎么办?? 微信绑定的手机号码已停机怎么办 绑定微信的手机号停机了怎么办验证 绑定手机停机微信怎么验证码怎么办 五菱之光雨刷开关手柄断了怎么办 快手家长控制模式密码忘了怎么办 有陌生人要求你拉他入群怎么办 手机一天接到多个陌生电话怎么办 阳光惠生活登录密码忘了怎么办 一个身份证注册了两个支付宝怎么办 买手办拆了发现坏了怎么办 六个月宝宝喝贝因美过敏怎么办