博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
闭锁——CountDownLatch
阅读量:6898 次
发布时间:2019-06-27

本文共 1579 字,大约阅读时间需要 5 分钟。

闭锁——CountDownLatch

一、概念

闭锁是一个同步工具类,主要用于等待其他线程活动结束后,再执行后续的操作。例如:在王者荣耀游戏中,需要10名玩家都准备就绪后,游戏才能开始。

CountDownLatch是concurrent包中的一个类,是一种灵活的闭锁实现。他可以使一个或多个线程等待一组事件的发生。闭锁状态包括一个计数器,表示需要等待的数量。

countDown方法是递减计数器,表示一个事件已经发生。await方法等待计数器为0,表示所有事件都已经发生。如果计数器值大于0,await会一直阻塞,等待计数器为0。

二、CountDownLatch用法

public static void main(String[] args) throws InterruptedException {    //开始闭锁(1个事件)        CountDownLatch startCdl = new CountDownLatch(1);    //结束闭锁(10个事件)        CountDownLatch endCdl = new CountDownLatch(10);    //固定线程池(10个线程)        ExecutorService es = Executors.newFixedThreadPool(10);        for (int i=0;i<10;i++){            es.execute(()->{                try {          //等待开始闭锁                    startCdl.await();          //休眠5秒                    Thread.sleep(5*1000);                    System.out.println(Thread.currentThread().getName());          //结束闭锁 计数器减1                    endCdl.countDown();                } catch (InterruptedException e) {                    e.printStackTrace();                }            });        }    //线程池关闭        es.shutdown();        long start = System.currentTimeMillis();    //开始闭锁 计数器减1 计数器值为0        startCdl.countDown();    //等待结束闭锁 10个线程结束后 计数器值为0, 执行或许操作        endCdl.await();        long end = System.currentTimeMillis();        System.out.println("运行时间为:"+(end-start));    }

在这里,我们设置“开始闭锁”是为了10个线程能够同时执行,如果没有“开始闭锁”,那么在循环时,前面的线程会先执行。

设置“开始闭锁”以后,10个线程均在await方法等待。当“开始闭锁”执行countDown方法时,计时器为0,10个线程的await方法同时释放,执行后续操作。随后主线程“结束闭锁”进行await等待,由于“结束闭锁”的计数器值为10,所以10个线程都执行countDown以后,计数器值才为0,这时“结束闭锁”await方法释放,执行以下操作。计算出10个任务同时执行所需要的时间。

转载地址:http://ipcdl.baihongyu.com/

你可能感兴趣的文章
【腾讯Bugly干货分享】微信读书 iOS 性能优化
查看>>
CentOS7.0下编译安装PHP 5.6.21
查看>>
怎样才能写得一手好代码?
查看>>
关于 Haskell 当中使用 mutable 数据的一些资料
查看>>
有了 tldr,妈妈再也不用担心我记不住命令了
查看>>
[分享]iOS开发-通过重写set方法,浅谈_和self.的区别
查看>>
EventBus使用详解
查看>>
指针和字符串和字符串常量、用gdb来获取非法内存中的内容
查看>>
分析递归程序比较好的画图法
查看>>
图像形态学的几种基本操作 Image Morphology
查看>>
2015 杭州黑客马拉松赛后随笔
查看>>
青阳网络文件传输系统 kiftd 1.0.17 正式发布
查看>>
搞懂Mysql InnoDB B+树索引
查看>>
SpaceX完成载人猎鹰9火箭静态点火试验,将于2月实现载人升空 ...
查看>>
子查询中有个不存在的列居然不报错是bug吗?
查看>>
亲历者说:Kubernetes API 与 Operator,不为人知的开发者战争 ...
查看>>
Android环境下hanlp汉字转拼音功能的使用介绍
查看>>
【转载】SAP物料主数据屏幕增强
查看>>
PHP扩展部署之最佳实践
查看>>
java B2B2C Springcloud电子商务平台源码-eureka集群整合config配置中心
查看>>