Android进阶——多线程系列之Semaphore、CyclicBarrier、CountDownLatch
今天向大家介绍的是多线程开发中的一些辅助类,他们的作用无非就是帮助我们让多个线程按照我们想要的执行顺序来执行。如果我们按照文字来理解Semaphore、CyclicBarrier、CountDownLatch可能会有点难度,如果看完实例再来看文字会恍然大悟。不用担心,今天带领大家用生活例子来理解这三个类,废话不多说,开车啦
Semaphore是一个计数信号量。信号量中维护着一个信号量许可集,线程可以通过调用acquire()来获取信号量的许可。当信号量被许可时,线程可以向下执行,否则线程等待。同时,线程也可以通过release()来释放它的信号量。Semaphore简单的可以理解为一张许可证
一、饭堂打饭
这里模拟了学生到食堂打饭的过程:买到粮票->打饭->提交粮票。其中semaphore代表食堂只有三张粮票的买卖,也可以理解为只有三个打饭窗口。THREAD_SIZE代表有五个学生线程同时打饭。下面通过打印信息来查看执行过程
学生们打饭还是井然有序的,打完就撤,留给下一位。Semaphore就是一张通行证,灵活使用它,你就能指挥线程
二、打印机
这里模拟五个人抢占一部打印机的场景。下面通过打印信息来查看执行过程
CyclicBarrier是一个同步辅助类,可以让正在运行中的线程与其他线程在某一公共时刻进行同步。CyclicBarrier简单理解为闸门,当我们达到某一目标时,闸门即可打开。
一、短跑比赛
这里模拟短跑比赛的过程:全部运动员准备->裁判一声令下->全部运动员开跑。其中THREAD_SIZE代表五名运动员,CyclicBarrier代表裁判。下面通过打印信息来查看这场比赛
全部运动员们是在准备好之后开始起跑,这也就是我们所说的线程同步。它的特点是主线程不用等待,继续执行。
二、门禁系统
这里模拟十个学生放学回家的场景。下面通过打印信息来查看执行过程
CountDownLatch也是一个同步辅助类,它可以设置一个或多个线程同时等待,直到条件被满足后,继续执行。
一、面试
这里模拟面试的过程:面试者进来->面试完成->面试者进来->面试完成的循环过程。其中THREAD_SIZE代表五名面试者,CountDownLatch代表面试这场会议。下面通过打印信息来查看面试过程
面试者是一个一个执行的,它的特点是可以让主线程进入等待状态,雅思阅读评分直到我们规定的五名面试者完成后才继续执行。
二、家人团圆饭
这里模拟一家三口回家吃团圆饭的场景,下面通过打印信息来查看执行过程
CyclicBarrier和CountDownLatch看起来很相似,但还是有一些不同点:
- CountDownLatch的作用是允许1个或N个线程等待其他线程完成执行(刚才就是允许主线程等待),而CyclicBarrier则是允许N个线程相互等待。
- CountDownLatch的计数器无法被重置,CyclicBarrier的计数器可以被重置后使用。
Android进阶——多线程系列之Semaphore、CyclicBarrier、CountDownLatch的更多相关文章
- Android进阶——多线程系列之Thread、Runnable、Callable、Future、FutureTask
多线程一直是初学者最抵触的东西,如果你想进阶的话,那必须闯过这道难关,特别是多线程中Thread.Runnable.Callable.Future.FutureTask这几个类往往是初学者容易搞混的. ...
- Android进阶——多线程系列之异步任务AsyncTask的使用与源码分析
AsyncTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并主线程中更新UI,通过AsyncTask可以更加方便执行后台任务以及在主线程中访问UI ...
- Android进阶——多线程系列之wait、notify、sleep、join、yield、synchronized关键字、ReentrantLock锁
多线程一直是初学者最困惑的地方,每次看到一篇文章,觉得很有难度,就马上叉掉,不看了,我以前也是这样过来的.后来,我发现这样的态度不行,知难而退,永远进步不了.于是,我狠下心来看完别人的博客,尽管很难但 ...
- Android进阶——多线程系列之四大线程池的使用介绍
线程池一直是初学者最抵触的东西,由于刚开始学习做项目并不会涉及到线程池的使用,但是不去学习它,心里又好像有个石头一直沉着,一直放心不下,其实是很简单的东西,早晚都要学,不如趁现在吧.由于文章从初学者的 ...
- 30行自己写并发工具类(Semaphore, CyclicBarrier, CountDownLatch)是什么体验?
30行自己写并发工具类(Semaphore, CyclicBarrier, CountDownLatch)是什么体验? 前言 在本篇文章当中首先给大家介绍三个工具Semaphore, CyclicBa ...
- J.U.C-三剑客[semaphore\CyclicBarrier\CountDownLatch]
一.semaphore信号量,底层也是基于AQS 使用: /** * 可以理解为控制某个资源最多有多少个线程同时执行,(比如洗手间,并行与排队) * 如果满了只能等待直到其它资源释放(可以理解为并发量 ...
- C# 多线程系列之Semaphore使用
Semaphore,即信号量的意思.是操作系统原始提供的内核同步对象. Semaphore semaphoreAcceptedClients = , 3,"Semaphore1") ...
- java多线程系列:Semaphore和Exchanger
本篇文章将介绍Semaphore和Exchanger这两个并发工具类. Semaphore 信号量(英语:Semaphore)又称为信号标,是一个同步对象,用于保持在0至指定最大值之间的一个计数值.当 ...
- Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例
概要 本章,我们对JUC包中的信号量Semaphore进行学习.内容包括:Semaphore简介Semaphore数据结构Semaphore源码分析(基于JDK1.7.0_40)Semaphore示例 ...
随机推荐
- 使用 Visual Studio Code 进行 Laravel 开发(转)
转自:https://laravelacademy.org/post/8016.html 关于 Laravel 代码开发工具大家各有所好,大部分应该在用 PHPStorm,Sublime 也有很多粉丝 ...
- 2-10 就业课(2.0)-oozie:13、14、clouderaManager的服务搭建
3.clouderaManager安装资源下载 第一步:下载安装资源并上传到服务器 我们这里安装CM5.14.0这个版本,需要下载以下这些资源,一共是四个文件即可 下载cm5的压缩包 下载地址:htt ...
- CentOS 7安装/卸载Redis,配置service服务管理
Redis简介 Redis功能简介 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 相比于传统的关系型数据库,Redis的存储方式是key-va ...
- Java并发——volatile的原理
111 Java并发——volatile的原理
- java随记 2月16
1.a=a+b 等于 a+=b ,且a+=b隐含强制类型转换 2.^ 表示异或 两个二进制同号为假,异号为真 即 0^0=0,1^1=0,0^1=1 3.三元运算 布尔表达式 ?表达式 ...
- 三十二、CI框架之配置域名和设置默认登陆网站
一.打开routes.php文件,将$route['default_controller'] = 'login'; 修改成我们需要的内容. 二.修改config.php中的base_url数据 三.L ...
- Jackson学习笔记
老版本的Jackson使用的包名为org.codehaus.jackson,而新版本使用的是com.fasterxml.jackson. Jackson主要包含了3个模块: jackson-core ...
- Netty的出现
原生NIO存在的问题 NIO的类库和API复杂, 使用麻烦: 需要熟练掌握Selector.ServerSocketChannel.SocketChannel.ByteBuffer 等. 需要具备其他 ...
- (最详细)JAVA如何连接虚拟机的HBASE和hadoop(JAVA如何远程访问虚拟机HBASE)
第一步: 首先把虚拟机和你的主机(本地电脑)弄通这样本地机器才能访问虚拟机里面的内容 我用的虚拟机为 VMware Workstation linux 为 centeros 补充一点虚拟机设置 1 ...
- python学习笔记2018-9-17
1.print("{0:^30}\n{1:^30}\n{1:10}".format("age","name")) {0:^30}中的0是一个 ...