已阅读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年河南省国企招聘考试(纪检监察)全真模拟试题及答案
- 人力资源管理档案管理工具
- 2025年卧式车床市场调查报告
- 2025年厦门石油钻采专用设备项目投资分析报告模板参考
- 2025年城市地下空间开发利用策略报告
- 《信息政策与法规》学科知识点
- 2025年封边机市场分析报告
- 2025年陕西建行面试真题及答案
- 机电检修工考试题及答案
- 质量损失追究管理办法
- 大商务管理培训课件
- 餐饮行业员工岗位职责与规范
- 新能源汽车核心零部件制造技术发展趋势及产业布局研究报告
- 高性能纸浆改性方法-洞察及研究
- 2025年江苏省中职职教高考统考数学试卷真题(含答案详解)
- 广东省深圳市福田区2024-2025学年八年级上学期语文期中考试试卷(含答案)
- 龙江森工历年考试题库及答案
- “湖北工匠杯”全省职工职业技能大赛无人机驾驶员赛项考试题及答案
- 2025年世界遗产影响评估指南与工具手册-联合国科教文组织
- 妇科围手术期护理管理
评论
0/150
提交评论