当前位置: 首页 > 科技观察

听故事学iOS系列 - 屎壳郎老板和它的收费公厕(一个故事搞懂多线程)

时间:2023-03-13 17:32:23 科技观察

听故事学iOS系列-蜣螂老大和它的付费公厕(一个故事看懂多线程)来自世界各地的游客们。来厕所的客人都是跟各自的旅行团来的。蜣螂主人要求客人上厕所排队一一上来,文明礼貌,拒绝插队、乱大小便等不文明行为。奇怪的游客和奇怪的蜣螂群的老大发现来这里上厕所的游客很奇怪:明明坑很多,排队的人也很多,但有时候只用一个坑,而且有时候会同时出现两个坑。使用了很多孔。为了搞清楚这些坑是怎么用的,蜣螂老板对前来上厕所的旅客和所属旅行团进行了调查统计分析。--乘客--根据乘客排尿的程度,蜣螂老大把乘客分为两类:尿急型准备好的尿急型乘客将跳入坑中。通过数据分析,蜣螂老板还发现:有急事的乘客只找靠窗的蹲位,不会去其他蹲位。有准备的旅客其实并不着急上厕所。她们就是看到排队上厕所的人多,就想通过排队来扩大人脉(这么巧妙的扩大人脉方式也醉了-_-|||)轮到他们进坑的时候,他们不会一头扎进去,而是先和身后的乘客“嘿哥们,走吧~”眼看身后的哥们要走,他直接走了。蜣螂老大还发现,这类乘客:一般都会尽量不去靠近窗户的坑。附言急的乘客不会主动跟后面的乘客打招呼,所以后面的乘客只有在亲眼看到急的乘客已经从坑里出来后,才会选择进坑。--旅行团篇--蜣螂老大在对旅客进行调研后,对旅客所属的旅行团进行了分析和分类。根据旅行团发布的《关于参团游客排队上公厕秩序的相关规定》内容(这个旅行团太宽泛了-_-|||),大致可以分为三类:宽松型,严格型,严格型,宽松型团规:团内Passenger尽量在最短的时间内解决使用厕所的问题,没有限制使用哪个坑。严格的组规:无论是否有空坑,组内一次只能有一名乘客进入坑内。严格的团规:团内旅客只能使用靠窗的坑。蜣螂老大很高兴,因为有了这两条信息,他就可以提前判断下一次有多少乘客同时进坑,分别使用哪些坑。蜣螂老大的试题还行。我们已经掌握了蜣螂老大收集的情报。然后,蜣螂老大就给大家出一道试题。一起来试着分析一下吧!题目:假设这次有四位乘客在排队:其中三位来自严格旅游团“严格旅游团”,另外两位来自宽松旅游团“宽松旅游团”。按照从前到后的顺序,他们是:*学生A:来自宽松组,有准备和安全*学生B:来自宽松组,有准备和安全*学生C:来自严格组,有紧急*小D:松散组,有准备*同学E:严格组,紧迫型模拟第一阶段入坑过程。轮到前排的A同学进坑了。同学A既然有所准备,就转头招呼同学B:“嘿哥们,我们一起去吧~”小B也兴奋的转头招呼小C:“嘿哥们,我们一起去吧~”小C已经憋了半天,准备冲进蹲位。小B见小C要走,收拾了一下准备离开。小A见小B要走,立马开始往坑里走。因为是准备型,小A很讨厌靠窗的1号蹲位,选择了2号蹲位。小B临走前也想了想。我们群允许多个成员同时入坑。于是小B也出发了。防备型最讨厌靠窗的1号蹲位,2号蹲位有人,所以选择了3号蹲位。虽然感觉很方便,但是小C还是想了想:我们组规定一次只能一个人入坑,前面两个入坑的不是我们组的,看来我可以入坑了.然后看了一下坑:我最喜欢靠窗的1号坑,刚好没人用!然后他跑到一号坑。总结:第一阶段有3名ABC同学同时入坑。他们分别使用了二号坑、三号坑和一号坑。轮到我了。于是招呼小E一起进坑,小E一言不发的低着头,准备冲进坑里。小D想了想:我们群允许多个群成员一起入坑。虽然组里的两个人A和B还没出来(假设A和B解的慢),我还是可以入坑的。于是着手选择1号坑,虽然没有人,但是小D不喜欢,2号和3号都有人(小A和小B在里面),所以小D选了4号坑,小E临走前轻松。想一想:我们团没有人是蹲位,1号蹲位也没有人。于是小E冲到了1号蹲位。总结:第二阶段DE的两个同学同时入坑,分别用了4号坑和1号坑。验证OK~分析完毕,下面我们用代码来验证一下是否是这样~蜣螂老大的测试题-代码验证.png,大家可以自己尝试运行一下,看看结果是不是和我们的分析一样!-(void)touchesBegan:(NSSet*)toucheswithEvent:(UIEvent*)event{//创建一个名为“严格旅游组”的严格旅游组dispatch_queue_tseriouslyTeam=dispatch_queue_create("com.azen.xu",DISPATCH_QUEUE_SERIAL);//创建一个relaxingtourgroupnamed"relaxingTourgroup"dispatch_queue_trelaxingTeam=dispatch_queue_create("com.azen.xu",DISPATCH_QUEUE_CONCURRENT);//创建一个轻松的小团Adispatch_async(relaxingTeam,^{//让小A便便时间稍长for(inti=0;i<=1000;i++){NSLog(@"我是小A,我在拉屎--完整性%%%%.3f---%@",i*0.1,[NSThreadcurrentThread]);}});//创建一个类似于smallAdispatch_async(relaxingTeam,^{//让小B大便时间长一点for(inti=0;i<=1000;i++){NSLog(@"我是小B,I'malsopooping--completeness%%%.3f---%@",i*0.1,[NSThreadcurrentThread]);}});//创建一组严格的紧急小Cdispatch_sync(seriouslyTeam,^{//小C大便时间更短for(inti=0;i<=10;i++){NSLog(@"我是小C,我现在大便--完成%%%d---%@",i*10,[NSThreadcurrentThread]);}});//轻松组准备的小Ddispatch_async(relaxingTeam,^{//让小D排的时间长一点for(inti=0;我<=1000;i++){NSLog(@"我是小D,我也在拉屎--完成度%%%%.3f---%@",i*0.1,[NSThreadcurrentThread]);}});//严格edispatch_sync(seriouslyTeam,^{//让小E拉长一点便便时间for(inti=0;i<=1000;i++){NSLog(@"我是小E,我也在拉屎--完成%%%.3f---%@",i*0.1,[NSThreadcurrentThread]);}});}总结嗯~故事讲完你懂了吗?不知道这鬼东西有什么用?不妨看看下面的对比表:概念对比表乘客对应任务1.1紧急乘客对应同步任务1.2准备好的乘客对应异步任务旅游团对应队列2.1轻松旅游团对应并发调度队列(ConcurrentDispatchQueue))2.2严格型巡行组对应串行队列(SerialDispatchQueue)2.3严酷巡行组对应主队列(MainQueue)蹲位对应线程3.1靠窗蹲位对应主线程(所有与UI显示相关的任务都必须在主线程中执行,所以...主线程就是靠窗的蹲位...)3.2蹲位对应的其他子线程应用尝试使用多线程知识:在六个任务中打印A,B,C,D,E,F六个字母,要求:A打印完B,C打印出来(需要BC打印出来几乎同时),C在打印完后打印D,E,F(DEF几乎同时打印)最后一个故事没有用到多线程知识我想说清楚,但我只是希望这个充满槽点的小故事,有点诡异,能给你带来些许心旷神怡的心情。会心一笑,带着这份好心情,让我们一起在这个神奇的编程世界里继续前行吧~^_^PS。刚编这个故事的时候,每次上厕所看到蹲着都忍不住想笑。。。不过想到边排便边傻笑可能会觉得怪怪的。。所以忍住了==聚苯硫醚。蜣螂老大的故事还没有结束!下一篇——《屎壳郎老板的神奇宝贝——蹲位兽》,和大家一起探秘老板公厕的蹲位,顺便说说runloop吧^_^