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

刚接触开发的童鞋,在学习多线程的时候,往往会比较吃力.因为这家伙比较抽象,有的时候较难通过运行代码直接看到多线程操作应该有的实际效果.和UI相比,多线程部分更注重理解.
所以,希望能通过这个故事,帮助大家更好地理解iOS中的多线程.故事是以GCD为主要实现手段进行展开的.
OK,那废话不多说,一起走进财富故事汇之屎壳郎老板的公厕生意吧!

屎壳郎老板和它的公厕生意

屎壳郎老板在旅游区开了一间收费公厕,招待南来北往的旅客们。来上厕所的客人,都是跟着各自的旅行团来的。屎壳郎老板要求上厕所的客人一定要排好队,一个一个来,讲文明,懂礼貌,谢绝插队和随地大小便等不文明行为。

奇葩的旅客、奇葩的团

屎壳郎老板发现,来它这里上厕所的旅客,都非常怪异:
明明坑位很多,排队的人也很多,可是有的时候只有一个坑位被使用,有的时候同时有好多坑位被使用。

为了弄清楚坑位的使用规律,屎壳郎老板对来上厕所的旅客,和他们所在的旅行团进行了调查统计分析。


-- 旅客篇 --

根据旅客的尿意程度,屎壳郎老板把旅客分为两类:

  • 尿急型
  • 有备无患型

尿急型旅客

  • 一旦前面的坑位没人,这类旅客就会一头扎进坑位中。

通过数据分析,屎壳郎老板还发现:

  • 尿急型旅客只认准靠窗的蹲位,别的蹲位一概不去。

有备无患型旅客

这类旅客其实不是很急着上厕所,他们只是看到排队上厕所的人多,想通过排队等坑位的时间,来拓展自己的人脉圈的(如此高明的拓展人脉圈手段也是醉了-_-|||)
轮到他们进坑的时候,他们不会一头扎进去,而是

  • 先勾搭他后面的旅客

“嘿哥们儿,一起啊~”

看到后面的哥们准备动身了,他才动身

屎壳郎老板还发现,这类旅客:

  • 一般会尽最大可能不用靠窗的坑位。

附注

由于尿急型旅客不主动招呼排在他后面的旅客,所以,后面的旅客只有亲眼看到尿急旅客已经方便完从坑位出来了,才会选坑进入。


-- 旅行团篇 --

研究完旅客,屎壳郎老板又对旅客们所在的旅行团做了分析和归类。根据旅行团印发的《关于参团游客排队上公厕秩序的相关规定》内容进行划分(这旅行团管的也太宽了吧-_-|||),大致可以分为三大类

  • 宽松型
  • 严格型
  • 苛刻型

宽松型

团规:团内旅客尽量用最短的时间解决完上厕所问题,使用哪个坑位不做限制。

严格型

团规:不管有没有空余的坑位,本团内,一次只能有一个旅客在坑位上。

苛刻型

团规:本团内的旅客,只能使用靠窗的那个坑位。


屎壳郎老板很开心,因为有了这两份资料,他就能提前判断出,下一次,会有几个旅客同时进坑,以及他们分别会用几号坑位。


屎壳郎老板的测试题

OK,屎壳郎老板收集到的情报我们已经掌握了,那么,屎壳郎老板给大家出了一份测试题,我们一起来试着分析下吧!

题目:

假设这次排队的旅客有四个:
其中 三个来自名叫“严格旅行团”的严格型旅行团
另外两个来自名叫“宽松旅行团”的宽松型团

根据从前到后的顺序,他们分别是:
* 小A同学:来自宽松团,有备无患型
* 小B同学:来自宽松团,有备无患型
* 小C同学:来自严格团,尿急型
* 小D同学:来自宽松团,有备无患型
* 小E同学:来自严格团,尿急型 

模拟入坑过程

第一阶段

  1. 轮到排在最前面的小 A 同学入坑了,由于小 A是个有备无患型的,扭过头来招呼小 B:“嘿哥们儿一起啊
  2. 小 B 同学也兴奋的扭过头招呼小 C:" 嘿哥们,一起啊~"
  3. 小 C 已经憋很久了,拔腿就准备往蹲位里冲。
  4. 小 B 看到小 C 准备动身了,自己也整理整理准备动身。
  5. 小 A 看小 B 准备动身了,自己马上动身走向坑位。因为是有备无患型,所以小 A 讨厌靠窗的1号蹲位,选择了2号蹲位。
  6. 小 B 动身前也思考了一下,我们团允许多个团员同时入坑。于是小 B 也动身了。有备无患型,讨厌靠窗的1号蹲位,2号蹲位又有人了,于是选择了3号蹲位
  7. 虽然便意浓浓,但小 C 还是略一思忖:我们团规定一次只能一个人入坑,前面入坑的两个都不是我们团的,看来我能入坑。然后看了一眼坑位:我喜欢的靠窗1号坑正好没人用!然后拔腿奔向了1号坑位。

总结:第一阶段同时入坑的有ABC三 位同学,分别使用了2号坑、3号坑和1号坑

第二阶段

  1. 亲眼看见小 C 从蹲位里面带幸福的走出来,小 D 知道,轮到自己了。于是招呼小 E 一起入坑
  2. 小 E 二话不说低着头就准备往坑里冲。小 D 见状略一思忖:我们团允许多个本团成员一起入坑,虽然之前两个团员小 A 和小 B 还没出来(假设小 A 和小B 解决的比较慢),但我还是可以入坑的。 于是动身选坑位
  3. 1号坑位虽然没人,但是小 D不喜欢,2号3号有人了(小 A 小 B 在里面),所以小 D 选择了4号坑位
  4. 小 E 临行前也简单思考了下:我们团没有人在蹲位中,1号蹲位没有人。于是小 E 冲向了1号蹲位。

总结:第二阶段同时入坑的有 DE 两位同学,分别使用了4号坑和1号坑。

验证

OK分析完成,我们用代码来验证下是不是这样

代码们

屎壳郎老板的测试题 - 代码验证.png

可以尝试自己运行下看看结果是不是和我们分析的一样哦!

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //  创建名叫“严格旅行团”的严格型旅行团
    dispatch_queue_t seriouslyTeam = dispatch_queue_create("com.azen.xu", DISPATCH_QUEUE_SERIAL);
    //  创建名叫“宽松旅行团”的宽松型旅行团
    dispatch_queue_t relaxingTeam = dispatch_queue_create("com.azen.xu",DISPATCH_QUEUE_CONCURRENT);
    
    
    //  创建宽松团的有备无患型小 A
    dispatch_async( relaxingTeam, ^{
        //  让小 A 便便的时间长一点
        for (int i = 0 ; i <= 1000 ; i++)
        {
            NSLog(@"我是小 A,我在便便 -- 完成度 %%%.3f ---%@",i * 0.1,[NSThread currentThread]);
        }
    });
    //  创建与小 A 相似的小 B
    dispatch_async( relaxingTeam, ^{
        //  让小 B 便便的时间也长一点
        for (int i = 0 ; i <= 1000 ; i++)
        {
            NSLog(@"我是小 B,我在也便便 -- 完成度 %%%.3f ---%@",i * 0.1,[NSThread currentThread]);
        }
    });
    //  创建严格团的尿急小 C
    dispatch_sync(seriouslyTeam, ^{
        //  小 C 便的时间短一点
        for (int i = 0 ; i <= 10 ; i++)
        {
            NSLog(@"我是小 C,我在也便便 -- 完成度 %%%d ---%@",i * 10,[NSThread currentThread]);
        }
    });
    //  宽松团的有备无患型小 D
    dispatch_async( relaxingTeam, ^{
        //  让小 D 便便的时间也长一点
        for (int i = 0 ; i <= 1000 ; i++)
        {
            NSLog(@"我是小 D,我在也便便 -- 完成度 %%%.3f ---%@",i * 0.1,[NSThread currentThread]);
        }
    });
    //  严格团的尿急小 E
    dispatch_sync( seriouslyTeam, ^{
        //  让小 E 便便的时间也长一点
        for (int i = 0 ; i <= 1000 ; i++)
        {
            NSLog(@"我是小 E,我在也便便 -- 完成度 %%%.3f ---%@",i * 0.1,[NSThread currentThread]);
        }
    });
}

总结

嗯哼~ 故事讲完了。没看明白?不知道这鬼东西有什么卵用?不妨看看下面的对照表哦:

概念对照表

  1. 旅客 对应 任务
    1.1 尿急型旅客 对应 同步任务
    1.2 有备无患型旅客 对应 异步任务
  2. 旅行团 对应 队列
    2.1 宽松型旅行团 对应 并发队列(Concurrent
    Dispatch Queue)
    2.2 严格型旅行团 对应 串行队列(Serial
    Dispatch Queue)
    2.3 苛刻型旅行团 对应 主队列(Main Queue)
  3. 蹲位 对应 线程
    3.1 靠窗蹲位 对应 主线程
    (所有涉及 UI 展示方面的任务都要在主线程中执行,所以... 主线程就是靠窗的蹲位啦...)
    3.2 其他蹲位 对应 子线程

应用

尝试用多线程知识实现:分 六个任务别打印A、B、C、D、E 、F 六个字母,要求:A打印完后打印 B 和 C(要求BC几乎同时打印),C 打印完后打印D、E、F( DEF几乎同时打印)

最后的最后

一个故事并不能将多线程的知识完全讲清楚,只是希望,这篇小小的、有点怪诞、槽点满满的故事,能带给大家一点轻松快乐的好心情。会心一笑,然后带着这份好心情,一起继续在这个充满魔法的编程世界里前行吧~ _

PS. 刚编出来这个故事时候,每次上厕所看到蹲位都忍不住想笑... 不过想到边排泄边傻笑可能有点怪怪的...所以还是忍住了= =

PPS. 屎壳郎老板的故事还没有结束哦!下一篇——《屎壳郎老板的神奇宝贝——蹲位兽》,和大家一起探秘屎壳郎老板公厕的蹲位,顺便聊一点runloop的小知识_

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • 一 太阳城是一座梦想之城,动物们追随着梦想的脚步,栖息于此,欢乐于此,但有时,也不免痛苦于此。欢乐之时,他们说这座...
    阿秋的冬天阅读 1,024评论 0 0
  • 从那天起,我开始失眠 你控制了谁的笑声,你就控制了他的人生。
    先生说阅读 186评论 0 3
  • 科技从诞生之日,就在抢夺基督教的地盘,两者在解释人和世界的问题上,有着截然相反的观点。基督教对于后起之秀的科技,处...
    adamant555阅读 392评论 0 0
  • 寒潮扑大洋, 九洲风雨狂, 玉米花生都霉烂, 农民遭殃。 中秋假日长, 千百万人忙, 东奔西走水沒膝, 游客臉丧。
    南海老人阅读 231评论 0 2
  • 也不知道恍恍惚惚过了多少时间,2018年在悄无声息中到来了,沉寂了许久的人们在这一刻都活跃了起来,大街小巷人头攒动...
    恬雅静阅读 307评论 0 0