聽(tīng)故事學(xué)iOS系列 - 屎殼郎老板和它的收費(fèi)公廁(一個(gè)故事搞懂多線程)

剛接觸開(kāi)發(fā)的童鞋,在學(xué)習(xí)多線程的時(shí)候,往往會(huì)比較吃力.因?yàn)檫@家伙比較抽象,有的時(shí)候較難通過(guò)運(yùn)行代碼直接看到多線程操作應(yīng)該有的實(shí)際效果.和UI相比,多線程部分更注重理解.
所以,希望能通過(guò)這個(gè)故事,幫助大家更好地理解iOS中的多線程.故事是以GCD為主要實(shí)現(xiàn)手段進(jìn)行展開(kāi)的.
OK,那廢話(huà)不多說(shuō),一起走進(jìn)財(cái)富故事匯之屎殼郎老板的公廁生意吧!

屎殼郎老板和它的公廁生意

屎殼郎老板在旅游區(qū)開(kāi)了一間收費(fèi)公廁意荤,招待南來(lái)北往的旅客們急侥。來(lái)上廁所的客人,都是跟著各自的旅行團(tuán)來(lái)的猜年。屎殼郎老板要求上廁所的客人一定要排好隊(duì),一個(gè)一個(gè)來(lái)婆赠,講文明膨蛮,懂禮貌谦趣,謝絕插隊(duì)和隨地大小便等不文明行為。

奇葩的旅客飞主、奇葩的團(tuán)

屎殼郎老板發(fā)現(xiàn)狮惜,來(lái)它這里上廁所的旅客,都非常怪異:
明明坑位很多,排隊(duì)的人也很多碌识,可是有的時(shí)候只有一個(gè)坑位被使用碾篡,有的時(shí)候同時(shí)有好多坑位被使用。

為了弄清楚坑位的使用規(guī)律筏餐,屎殼郎老板對(duì)來(lái)上廁所的旅客开泽,和他們所在的旅行團(tuán)進(jìn)行了調(diào)查統(tǒng)計(jì)分析。


-- 旅客篇 --

根據(jù)旅客的尿意程度魁瞪,屎殼郎老板把旅客分為兩類(lèi):

  • 尿急型
  • 有備無(wú)患型

尿急型旅客

  • 一旦前面的坑位沒(méi)人穆律,這類(lèi)旅客就會(huì)一頭扎進(jìn)坑位中。

通過(guò)數(shù)據(jù)分析导俘,屎殼郎老板還發(fā)現(xiàn):

  • 尿急型旅客只認(rèn)準(zhǔn)靠窗的蹲位峦耘,別的蹲位一概不去。

有備無(wú)患型旅客

這類(lèi)旅客其實(shí)不是很急著上廁所旅薄,他們只是看到排隊(duì)上廁所的人多辅髓,想通過(guò)排隊(duì)等坑位的時(shí)間,來(lái)拓展自己的人脈圈的(如此高明的拓展人脈圈手段也是醉了-_-|||)
輪到他們進(jìn)坑的時(shí)候,他們不會(huì)一頭扎進(jìn)去利朵,而是

  • 先勾搭他后面的旅客

“嘿哥們兒律想,一起啊~”

看到后面的哥們準(zhǔn)備動(dòng)身了,他才動(dòng)身

屎殼郎老板還發(fā)現(xiàn)绍弟,這類(lèi)旅客:

  • 一般會(huì)盡最大可能不用靠窗的坑位技即。

附注

由于尿急型旅客不主動(dòng)招呼排在他后面的旅客,所以樟遣,后面的旅客只有親眼看到尿急旅客已經(jīng)方便完從坑位出來(lái)了而叼,才會(huì)選坑進(jìn)入。


-- 旅行團(tuán)篇 --

研究完旅客豹悬,屎殼郎老板又對(duì)旅客們所在的旅行團(tuán)做了分析和歸類(lèi)葵陵。根據(jù)旅行團(tuán)印發(fā)的《關(guān)于參團(tuán)游客排隊(duì)上公廁秩序的相關(guān)規(guī)定》內(nèi)容進(jìn)行劃分(這旅行團(tuán)管的也太寬了吧-_-|||),大致可以分為三大類(lèi)

  • 寬松型
  • 嚴(yán)格型
  • 苛刻型

寬松型

團(tuán)規(guī):團(tuán)內(nèi)旅客盡量用最短的時(shí)間解決完上廁所問(wèn)題瞻佛,使用哪個(gè)坑位不做限制脱篙。

嚴(yán)格型

團(tuán)規(guī):不管有沒(méi)有空余的坑位,本團(tuán)內(nèi)伤柄,一次只能有一個(gè)旅客在坑位上绊困。

苛刻型

團(tuán)規(guī):本團(tuán)內(nèi)的旅客,只能使用靠窗的那個(gè)坑位适刀。


屎殼郎老板很開(kāi)心秤朗,因?yàn)橛辛诉@兩份資料,他就能提前判斷出笔喉,下一次取视,會(huì)有幾個(gè)旅客同時(shí)進(jìn)坑,以及他們分別會(huì)用幾號(hào)坑位常挚。


屎殼郎老板的測(cè)試題

OK作谭,屎殼郎老板收集到的情報(bào)我們已經(jīng)掌握了,那么奄毡,屎殼郎老板給大家出了一份測(cè)試題丢早,我們一起來(lái)試著分析下吧!

題目:

假設(shè)這次排隊(duì)的旅客有四個(gè):
其中 三個(gè)來(lái)自名叫“嚴(yán)格旅行團(tuán)”的嚴(yán)格型旅行團(tuán)
另外兩個(gè)來(lái)自名叫“寬松旅行團(tuán)”的寬松型團(tuán)

根據(jù)從前到后的順序秧倾,他們分別是:
* 小A同學(xué):來(lái)自寬松團(tuán)怨酝,有備無(wú)患型
* 小B同學(xué):來(lái)自寬松團(tuán),有備無(wú)患型
* 小C同學(xué):來(lái)自嚴(yán)格團(tuán)那先,尿急型
* 小D同學(xué):來(lái)自寬松團(tuán)农猬,有備無(wú)患型
* 小E同學(xué):來(lái)自嚴(yán)格團(tuán),尿急型 

模擬入坑過(guò)程

第一階段

  1. 輪到排在最前面的小 A 同學(xué)入坑了售淡,由于小 A是個(gè)有備無(wú)患型的斤葱,扭過(guò)頭來(lái)招呼小 B:“嘿哥們兒一起啊
  2. 小 B 同學(xué)也興奮的扭過(guò)頭招呼小 C:" 嘿哥們慷垮,一起啊~"
  3. 小 C 已經(jīng)憋很久了,拔腿就準(zhǔn)備往蹲位里沖揍堕。
  4. 小 B 看到小 C 準(zhǔn)備動(dòng)身了料身,自己也整理整理準(zhǔn)備動(dòng)身。
  5. 小 A 看小 B 準(zhǔn)備動(dòng)身了衩茸,自己馬上動(dòng)身走向坑位芹血。因?yàn)槭怯袀錈o(wú)患型,所以小 A 討厭靠窗的1號(hào)蹲位楞慈,選擇了2號(hào)蹲位幔烛。
  6. 小 B 動(dòng)身前也思考了一下,我們團(tuán)允許多個(gè)團(tuán)員同時(shí)入坑囊蓝。于是小 B 也動(dòng)身了饿悬。有備無(wú)患型,討厭靠窗的1號(hào)蹲位聚霜,2號(hào)蹲位又有人了狡恬,于是選擇了3號(hào)蹲位
  7. 雖然便意濃濃,但小 C 還是略一思忖:我們團(tuán)規(guī)定一次只能一個(gè)人入坑蝎宇,前面入坑的兩個(gè)都不是我們團(tuán)的傲宜,看來(lái)我能入坑。然后看了一眼坑位:我喜歡的靠窗1號(hào)坑正好沒(méi)人用夫啊!然后拔腿奔向了1號(hào)坑位。

總結(jié):第一階段同時(shí)入坑的有ABC三 位同學(xué)辆憔,分別使用了2號(hào)坑撇眯、3號(hào)坑和1號(hào)坑

第二階段

  1. 親眼看見(jiàn)小 C 從蹲位里面帶幸福的走出來(lái),小 D 知道虱咧,輪到自己了熊榛。于是招呼小 E 一起入坑
  2. 小 E 二話(huà)不說(shuō)低著頭就準(zhǔn)備往坑里沖。小 D 見(jiàn)狀略一思忖:我們團(tuán)允許多個(gè)本團(tuán)成員一起入坑腕巡,雖然之前兩個(gè)團(tuán)員小 A 和小 B 還沒(méi)出來(lái)(假設(shè)小 A 和小B 解決的比較慢)玄坦,但我還是可以入坑的。 于是動(dòng)身選坑位
  3. 1號(hào)坑位雖然沒(méi)人绘沉,但是小 D不喜歡煎楣,2號(hào)3號(hào)有人了(小 A 小 B 在里面),所以小 D 選擇了4號(hào)坑位
  4. 小 E 臨行前也簡(jiǎn)單思考了下:我們團(tuán)沒(méi)有人在蹲位中车伞,1號(hào)蹲位沒(méi)有人择懂。于是小 E 沖向了1號(hào)蹲位。

總結(jié):第二階段同時(shí)入坑的有 DE 兩位同學(xué)另玖,分別使用了4號(hào)坑和1號(hào)坑困曙。

驗(yàn)證

OK分析完成表伦,我們用代碼來(lái)驗(yàn)證下是不是這樣

代碼們

屎殼郎老板的測(cè)試題 - 代碼驗(yàn)證.png

可以嘗試自己運(yùn)行下看看結(jié)果是不是和我們分析的一樣哦!

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //  創(chuàng)建名叫“嚴(yán)格旅行團(tuán)”的嚴(yán)格型旅行團(tuán)
    dispatch_queue_t seriouslyTeam = dispatch_queue_create("com.azen.xu", DISPATCH_QUEUE_SERIAL);
    //  創(chuàng)建名叫“寬松旅行團(tuán)”的寬松型旅行團(tuán)
    dispatch_queue_t relaxingTeam = dispatch_queue_create("com.azen.xu",DISPATCH_QUEUE_CONCURRENT);
    
    
    //  創(chuàng)建寬松團(tuán)的有備無(wú)患型小 A
    dispatch_async( relaxingTeam, ^{
        //  讓小 A 便便的時(shí)間長(zhǎng)一點(diǎn)
        for (int i = 0 ; i <= 1000 ; i++)
        {
            NSLog(@"我是小 A慷丽,我在便便 -- 完成度 %%%.3f ---%@",i * 0.1,[NSThread currentThread]);
        }
    });
    //  創(chuàng)建與小 A 相似的小 B
    dispatch_async( relaxingTeam, ^{
        //  讓小 B 便便的時(shí)間也長(zhǎng)一點(diǎn)
        for (int i = 0 ; i <= 1000 ; i++)
        {
            NSLog(@"我是小 B蹦哼,我在也便便 -- 完成度 %%%.3f ---%@",i * 0.1,[NSThread currentThread]);
        }
    });
    //  創(chuàng)建嚴(yán)格團(tuán)的尿急小 C
    dispatch_sync(seriouslyTeam, ^{
        //  小 C 便的時(shí)間短一點(diǎn)
        for (int i = 0 ; i <= 10 ; i++)
        {
            NSLog(@"我是小 C,我在也便便 -- 完成度 %%%d ---%@",i * 10,[NSThread currentThread]);
        }
    });
    //  寬松團(tuán)的有備無(wú)患型小 D
    dispatch_async( relaxingTeam, ^{
        //  讓小 D 便便的時(shí)間也長(zhǎng)一點(diǎn)
        for (int i = 0 ; i <= 1000 ; i++)
        {
            NSLog(@"我是小 D要糊,我在也便便 -- 完成度 %%%.3f ---%@",i * 0.1,[NSThread currentThread]);
        }
    });
    //  嚴(yán)格團(tuán)的尿急小 E
    dispatch_sync( seriouslyTeam, ^{
        //  讓小 E 便便的時(shí)間也長(zhǎng)一點(diǎn)
        for (int i = 0 ; i <= 1000 ; i++)
        {
            NSLog(@"我是小 E纲熏,我在也便便 -- 完成度 %%%.3f ---%@",i * 0.1,[NSThread currentThread]);
        }
    });
}

總結(jié)

嗯哼~ 故事講完了。沒(méi)看明白杨耙?不知道這鬼東西有什么卵用赤套?不妨看看下面的對(duì)照表哦:

概念對(duì)照表

  1. 旅客 對(duì)應(yīng) 任務(wù)
    1.1 尿急型旅客 對(duì)應(yīng) 同步任務(wù)
    1.2 有備無(wú)患型旅客 對(duì)應(yīng) 異步任務(wù)
  2. 旅行團(tuán) 對(duì)應(yīng) 隊(duì)列
    2.1 寬松型旅行團(tuán) 對(duì)應(yīng) 并發(fā)隊(duì)列(Concurrent
    Dispatch Queue)
    2.2 嚴(yán)格型旅行團(tuán) 對(duì)應(yīng) 串行隊(duì)列(Serial
    Dispatch Queue)
    2.3 苛刻型旅行團(tuán) 對(duì)應(yīng) 主隊(duì)列(Main Queue)
  3. 蹲位 對(duì)應(yīng) 線程
    3.1 靠窗蹲位 對(duì)應(yīng) 主線程
    (所有涉及 UI 展示方面的任務(wù)都要在主線程中執(zhí)行,所以... 主線程就是靠窗的蹲位啦...)
    3.2 其他蹲位 對(duì)應(yīng) 子線程

應(yīng)用

嘗試用多線程知識(shí)實(shí)現(xiàn):分 六個(gè)任務(wù)別打印A珊膜、B容握、C、D车柠、E 剔氏、F 六個(gè)字母,要求:A打印完后打印 B 和 C(要求BC幾乎同時(shí)打又竦弧)谈跛,C 打印完后打印D、E塑陵、F( DEF幾乎同時(shí)打印)

最后的最后

一個(gè)故事并不能將多線程的知識(shí)完全講清楚感憾,只是希望,這篇小小的令花、有點(diǎn)怪誕阻桅、槽點(diǎn)滿(mǎn)滿(mǎn)的故事,能帶給大家一點(diǎn)輕松快樂(lè)的好心情兼都。會(huì)心一笑嫂沉,然后帶著這份好心情,一起繼續(xù)在這個(gè)充滿(mǎn)魔法的編程世界里前行吧~ _

PS. 剛編出來(lái)這個(gè)故事時(shí)候扮碧,每次上廁所看到蹲位都忍不住想笑... 不過(guò)想到邊排泄邊傻笑可能有點(diǎn)怪怪的...所以還是忍住了= =

PPS. 屎殼郎老板的故事還沒(méi)有結(jié)束哦趟章!下一篇——《屎殼郎老板的神奇寶貝——蹲位獸》,和大家一起探秘屎殼郎老板公廁的蹲位慎王,順便聊一點(diǎn)runloop的小知識(shí)_

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚓土,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子赖淤,更是在濱河造成了極大的恐慌北戏,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漫蛔,死亡現(xiàn)場(chǎng)離奇詭異嗜愈,居然都是意外死亡旧蛾,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)蠕嫁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锨天,“玉大人,你說(shuō)我怎么就攤上這事剃毒〔“溃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵赘阀,是天一觀的道長(zhǎng)益缠。 經(jīng)常有香客問(wèn)我,道長(zhǎng)基公,這世上最難降的妖魔是什么幅慌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮轰豆,結(jié)果婚禮上胰伍,老公的妹妹穿的比我還像新娘。我一直安慰自己酸休,他們只是感情好骂租,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著斑司,像睡著了一般渗饮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宿刮,一...
    開(kāi)封第一講書(shū)人閱讀 52,184評(píng)論 1 308
  • 那天互站,我揣著相機(jī)與錄音,去河邊找鬼糙置。 笑死,一個(gè)胖子當(dāng)著我的面吹牛是目,可吹牛的內(nèi)容都是我干的谤饭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼懊纳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼揉抵!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起嗤疯,我...
    開(kāi)封第一講書(shū)人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤冤今,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后茂缚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體戏罢,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屋谭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了龟糕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桐磁。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖讲岁,靈堂內(nèi)的尸體忽然破棺而出我擂,到底是詐尸還是另有隱情,我是刑警寧澤缓艳,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布校摩,位于F島的核電站,受9級(jí)特大地震影響阶淘,放射性物質(zhì)發(fā)生泄漏衙吩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一舶治、第九天 我趴在偏房一處隱蔽的房頂上張望分井。 院中可真熱鬧,春花似錦霉猛、人聲如沸尺锚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瘫辩。三九已至,卻和暖如春坛悉,著一層夾襖步出監(jiān)牢的瞬間伐厌,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工裸影, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挣轨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓轩猩,卻偏偏與公主長(zhǎng)得像卷扮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子均践,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 一 太陽(yáng)城是一座夢(mèng)想之城晤锹,動(dòng)物們追隨著夢(mèng)想的腳步,棲息于此彤委,歡樂(lè)于此鞭铆,但有時(shí),也不免痛苦于此焦影。歡樂(lè)之時(shí)车遂,他們說(shuō)這座...
    阿秋的冬天閱讀 1,094評(píng)論 0 0
  • 從那天起封断,我開(kāi)始失眠 你控制了誰(shuí)的笑聲,你就控制了他的人生艰额。
    先生說(shuō)閱讀 205評(píng)論 0 3
  • 科技從誕生之日澄港,就在搶奪基督教的地盤(pán),兩者在解釋人和世界的問(wèn)題上柄沮,有著截然相反的觀點(diǎn)回梧。基督教對(duì)于后起之秀的科技祖搓,處...
    adamant555閱讀 451評(píng)論 0 0
  • 寒潮撲大洋狱意, 九洲風(fēng)雨狂, 玉米花生都霉?fàn)€拯欧, 農(nóng)民遭殃详囤。 中秋假日長(zhǎng), 千百萬(wàn)人忙镐作, 東奔西走水沒(méi)膝藏姐, 游客臉喪。
    南海老人閱讀 247評(píng)論 0 2
  • 也不知道恍恍惚惚過(guò)了多少時(shí)間,2018年在悄無(wú)聲息中到來(lái)了杨蛋,沉寂了許久的人們?cè)谶@一刻都活躍了起來(lái)兜材,大街小巷人頭攢動(dòng)...
    恬雅靜閱讀 334評(píng)論 0 0