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示例 ...
随机推荐
- 南邮平台之Hello,RE!
小白闲逛了一下南邮平台看到了逆向这题,小白在网上看了一下别人的write up发现有点复杂.于是小白就试试看,直接Underfine然后结果就出来了.....有点意外...... 结果flag{Wel ...
- 浅谈JVM线程调度机制及主要策略
在之前有说过线程,应该都知道,所谓线程就是进程中的一个子任务,一个进程有多个线程.今天的话主要就是谈一谈JVM线程调度机制.我们结合线程来说,当我们在做多线程的案例时,如一个经典案例,火车站卖票. * ...
- Project导入RedMine甘特图展示
前端时间因公司业务需要使用RedMine来管理项目进度. 但是使用其自带的csv导入工具无法完成导入. 而我是java开发,并不会所谓的ruby语言,自然无法在段时间内完成此导入功能的修改. so,经 ...
- 014.CI4框架CodeIgniter数据库操作之:查询数据库,并让数据以对象的方式返回查询结果
01. 我们在CI4框架中的Model文件夹新建一个User_model.php的文件,使用的是getResultArray,表示并让数据以数组的方式返回查询结果,代码如下: <?php nam ...
- SpringBoot-配置Java方式
SpringBoot中使用Java方式配置步骤如下: 在类上加入@Configuration注解,代表作为配置类 在该类方法上加入@Bean注解,代表将方法返回的Bean加入Spring容器 在该类中 ...
- DCGAN生成目标训练图片
前言: GAN的原理很简单,但是它有很多变体,如:DCGAN.CycleGAN.DeblurGAN等,它们也被用在不同地方,本文将用到DCGAN来生成头像图片,可以做到以假乱真的地步. 1.首先调用程 ...
- python scipy优化器模块(optimize)
pyhton数据处理与分析之scipy优化器及不同函数求根 1.Scipy的优化器模块optimize可以用来求取不同函数在多个约束条件下的最优化问题,也可以用来求取函数在某一点附近的根和对应的函数值 ...
- 《ES6标准入门》(阮一峰)--11.对象的新增方法
1.Object.is() ES5 比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===).它们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0等于-0.J ...
- Linux每日练习-awk命令之内部自定义函数 20200224
- 文本编辑器vim/vi——末行模式
指令格式: #vim 文件路径作用:打开指定的文件. 进入方式:由命令模式进入,按下“:”或者“/(表示查找)”即可进入 退出方式: a. 按下esc b. 连按2次esc键 c. 删除末行全部输入字 ...