ios基礎(chǔ)之一天一道筆試題(5)

請(qǐng)寫出程序執(zhí)行后的輸出結(jié)果:

- (void)threadTest {
    NSLog(@"0");
    dispatch_queue_t queue = dispatch_queue_create("com.queue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(queue, ^{
        NSLog(@"1");
        dispatch_async(queue, ^{
            sleep(5);
            NSLog(@"2");
        });
        dispatch_async(queue, ^{
            sleep(1);
            NSLog(@"3");
        });
        NSLog(@"4");
    });
    NSLog(@"5");
}

結(jié)果:0,1,4,5,3,2
解析:本題主要考察對(duì)隊(duì)列、線程執(zhí)行順序、同步、異步的理解和掌握。
首先,代碼中創(chuàng)建的是并發(fā)隊(duì)列,則表示CPU會(huì)在線程間快速切換,從而影響代碼的輸出結(jié)果,所以特意加了線程休眠操作以保證程序的輸出固定,下面我們剖析執(zhí)行過程:
第一步輸出0是毋庸置疑的,不做解釋,
第二步創(chuàng)建了一個(gè)并發(fā)隊(duì)列,
第三步同步執(zhí)行代碼,不會(huì)開啟新的線程,會(huì)阻塞當(dāng)前線程(主線程a),等待內(nèi)部block里代碼執(zhí)行完才會(huì)結(jié)束,我們來到block內(nèi)部繼續(xù)分析代碼執(zhí)行:
輸出1也不做解釋,
繼續(xù)執(zhí)行,異步執(zhí)行一段代碼,此時(shí)會(huì)開啟新的線程b來執(zhí)行block內(nèi)部的代碼,不會(huì)阻塞線程,代碼繼續(xù)執(zhí)行,同理異步開啟一個(gè)新的線程c來執(zhí)行block內(nèi)部的代碼,繼續(xù)執(zhí)行,輸出4,至此,a線程里的block執(zhí)行完畢,代碼繼續(xù)向下執(zhí)行,輸出5,
a線程實(shí)行完畢,由于線程b和c有休眠操作,會(huì)進(jìn)入休眠狀態(tài),待休眠結(jié)束,會(huì)繼續(xù)執(zhí)行,因?yàn)榫€程c的休眠時(shí)間短,故線程c先執(zhí)行,假設(shè)線程b和c在同等條件下執(zhí)行,則c線程會(huì)先于b線程結(jié)束執(zhí)行,故輸出順序?yàn)?,2,
由此我們最終得出順序?yàn)?0,1,4,5,3,2
結(jié)束語:此題可以有多種變形:如將并發(fā)隊(duì)列改為串行隊(duì)列,將同步改為異步,不同的組合會(huì)有不同的結(jié)果,有興趣的可以自己嘗試一下(有可能會(huì)出現(xiàn)死鎖的情況哦,關(guān)于死鎖的情況以后會(huì)單獨(dú)解析)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • iOS多線程編程 基本知識(shí) 1. 進(jìn)程(process) 進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序,就是一段程序的執(zhí)...
    陵無山閱讀 6,351評(píng)論 1 14
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,675評(píng)論 1 32
  • 從哪說起呢? 單純講多線程編程真的不知道從哪下嘴。。 不如我直接引用一個(gè)最簡單的問題,以這個(gè)作為切入點(diǎn)好了 在ma...
    Mr_Baymax閱讀 2,912評(píng)論 1 17
  • 前言: 最近想回顧一下多線程問題,看到一篇文章寫的非常詳細(xì),為了便于以后查找以及加深印象,就照著原文摘錄了下文,原...
    FM_0138閱讀 1,095評(píng)論 1 1
  • 上午,子儀發(fā)來微信,她說:我和禾塘曾說起,下次繼續(xù)組織叢書的出版,下次我計(jì)劃出版日記集。今早讀你的日記,覺得很好,...
    黃葉村人閱讀 551評(píng)論 6 4

友情鏈接更多精彩內(nèi)容