




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android进阶多线程系列之Semaphore、CyclicBarrier、CountDownLatchSemaphoreSemaphore是一个计数信号量。信号量中维护着一个信号量许可集,线程可以通过调用acquire()来获取信号量的许可。当信号量被许可时,线程可以向下执行,否则线程等待。同时,线程也可以通过release()来释放它的信号量。Semaphore简单的可以理解为一张许可证 饭堂打饭public class SemaphoreActivity extends AppCompatActivity /线程数 private static final int THREAD_SIZE = 5; private Semaphore semaphore; Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_semaphore); semaphore = new Semaphore(3); for (int i = 0; i 打饭-提交粮票。其中semaphore代表食堂只有三张粮票的买卖,也可以理解为只有三个打饭窗口。THREAD_SIZE代表有五个学生线程同时打饭。下面通过打印信息来查看执行过程Thread-636号买到粮票Thread-636号窗口开始打饭Thread-632号买到粮票Thread-632号窗口开始打饭Thread-635号买到粮票Thread-635号窗口开始打饭.隔了2秒后Thread-636号提交粮票Thread-633号买到粮票Thread-633号窗口开始打饭Thread-632号提交粮票Thread-634号买到粮票Thread-634号窗口开始打饭Thread-635号提交粮票Thread-633号提交粮票Thread-634号提交粮票可以看到学生们打饭还是井然有序的,打完就撤,留给下一位。Semaphore就是一张通行证,灵活使用它,你就能指挥线程 打印机public class PrinterActivity extends AppCompatActivity /线程数 private static final int THREAD_SIZE = 5; private Semaphore semaphore; Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_printer); semaphore = new Semaphore(1); for (int i = 0; i 各就各位,预备跑); ); for (int i = 0; i 裁判一声令下-全部运动员开跑。其中THREAD_SIZE代表五名运动员,CyclicBarrier代表裁判。下面通过打印信息来查看这场比赛Thread-682号选手准备好了Thread-683号选手准备好了Thread-684号选手准备好了主线程不用等待,继续执行Thread-686号选手准备好了Thread-685号选手准备好了参赛者5个全部准备完毕 - 各就各位,预备跑Thread-685跑,跑,跑Thread-682跑,跑,跑Thread-683跑,跑,跑Thread-684跑,跑,跑Thread-686跑,跑,跑可以看到全部运动员们是在准备好之后开始起跑,这也就是我们所说的线程同步。而且它的特点是主线程不用等待,继续执行。 门禁系统public class DoorActivity extends AppCompatActivity /线程数 private static final int THREAD_SIZE = 10; private CyclicBarrier cb; Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_door); cb = new CyclicBarrier(THREAD_SIZE, new Runnable() Override public void run() System.out.println(人到齐了 - 开门); ); for (int i = 0; i 等待开门回家); cb.await(); System.out.println(Thread.currentThread().getName() + 放学回家); catch (InterruptedException e) e.printStackTrace(); catch (BrokenBarrierException e) e.printStackTrace(); 这里模拟十个学生放学回家的场景。下面通过打印信息来查看执行过程Thread-268已刷卡 - 等待开门回家Thread-267已刷卡 - 等待开门回家主线程不用等待,继续执行Thread-271已刷卡 - 等待开门回家Thread-272已刷卡 - 等待开门回家Thread-269已刷卡 - 等待开门回家Thread-270已刷卡 - 等待开门回家Thread-274已刷卡 - 等待开门回家Thread-273已刷卡 - 等待开门回家Thread-275已刷卡 - 等待开门回家Thread-276已刷卡 - 等待开门回家人到齐了 - 开门Thread-276放学回家Thread-268放学回家Thread-267放学回家Thread-271放学回家Thread-272放学回家Thread-269放学回家Thread-270放学回家Thread-274放学回家Thread-273放学回家Thread-275放学回家CountDownLatchCountDownLatch也是一个同步辅助类,它可以设置一个或多个线程同时等待,直到条件被满足后,继续执行。 面试public class CountDownLatchActivity extends AppCompatActivity /线程数 private static final int THREAD_SIZE = 5; private CountDownLatch cdl; Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_count_down_latch); try cdl = new CountDownLatch(THREAD_SIZE); for (int i = 0; i 面试会议结束了); catch (InterruptedException e) e.printStackTrace(); private class IntervieweeThread extends Thread Oride public void run() System.out.println(Thread.currentThread().getName() + 号面试者,开始面试); cdl.countDown(); System.out.println(Thread.currentThread().getName() + 面试中.面试成功); 这里模拟面试的过程:面试者进来-面试完成-面试者进来-面试完成的循环过程。其中THREAD_SIZE代表五名面试者,CountDownLatch代表面试这场会议。下面通过打印信息来查看面试过程Thread-757号面试者,开始面试Thread-757面试中.面试成功Thread-758号面试者,开始面试Thread-758面试中.面试成功Thread-759号面试者,开始面试Thread-759面试中.面试成功主线程需要等待Thread-760号面试者,开始面试Thread-760面试中.面试成功Thread-761号面试者,开始面试Thread-761面试中.面试成功主线程继续执行 - 面试会议结束了可以看到全部面试者是一个一个执行的,它的特点是可以让主线程进入等待状态,直到我们规定的五名面试者完成后才继续执行。 家人团圆饭public class FamilyActivity extends AppCompatActivity private CountDownLatch cdl; Override protected void onCreate(Bundle savedInstanceState) super.onCeate(savedInstanceState); setContentView(R.layout.activity_family); cdl = new CountDownLatch(3); new Thread() public void run() fatherToRes(); cdl.countDown(); .start(); new Thread() public void run() motherToRes(); cdl.countDown(); .start(); new Thread() public void run() meToRes(); cdl.countDown(); .start(); try cdl.await(); togetherToEat(); catch (InterruptedException e) e.printStackTrace(); public static void fatherToRes() System.out.println(爸爸步行去饭店需要3小时。); public static void motherToRes() System.out.println(妈妈挤公交去饭店需要2小时。); public static void meToRes() System.out.println(我乘地铁去饭店需要1小时。); public static void togetherToEat() System.out.println(一家人到齐了,开始吃饭); 这里模拟一家三口回家吃团圆饭的场景,下面通过打印信息来查看执行过程妈妈挤公交去饭店需要2小时。爸
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年医疗资源均衡配置与区域发展研究报告
- 老旧小区供暖系统升级与热能管理方案
- 数字经济基础设施建设实施方案评估报告2025
- 中小学体育教师健康教育能力培养研究
- AI背景下小微企业财务与业务融合实践
- 风电场无人机应用成本节约与运维效率研究报告2025
- 高二年级实践教学计划
- 茶叶活动策划方案
- 脉冲射频治疗神经病理性疼痛的病例报告与分析
- 2025年度教育机构培训工作计划
- 豪宅地库研究方案
- 印鉴管理使用培训课件
- 文明乡风培训课件
- 2025年秋期新教材部编人教版三年级上册道德与法治教学计划+进度表
- 水工结构理论知识培训课件
- 2025云南广南民族文化旅游产业有限公司招聘14人笔试备考试题及答案解析
- 2025年【秋】【初三】【九年级】开学第一课主题班会:奋楫启航征初三 青春执笔赢未来
- 2025-2026粤教粤科版(2024)科学三年级上册教学设计(附目录)
- 《建筑基坑工程监测技术标准》(50497-2019)
- GA 1809-2022城市供水系统反恐怖防范要求
- 领导干部个人有关事项报告表(2019版)(范本模板)
评论
0/150
提交评论