iOS GCD 同步、異步、并行、串行

結(jié)合GCD來簡(jiǎn)單分析同步、異步、串行、并行。

正在進(jìn)行中的程序被稱為進(jìn)程(一個(gè)正在運(yùn)行的App),負(fù)責(zé)程序運(yùn)行的內(nèi)存分配;每一個(gè)進(jìn)程都有自己獨(dú)立的虛擬內(nèi)存空間。線程是進(jìn)程中一個(gè)獨(dú)立的執(zhí)行路徑(控制單元),一個(gè)進(jìn)程中至少包含一條線程,即主線程,線程里面有非常多的任務(wù)(同步,異步)

1.同步 dispatch_sync

按照代碼的編寫順序執(zhí)行

2.異步 dispatch_async

并發(fā)執(zhí)行,無法確定任務(wù)的執(zhí)行順序

3.串行隊(duì)列 DISPATCH_QUEUE_SERIAL

任務(wù)按照順序被調(diào)度,前一個(gè)任務(wù)不執(zhí)行完畢,隊(duì)列不會(huì)調(diào)度,任務(wù)只會(huì)順序執(zhí)行

4.并行隊(duì)列 DISPATCH_QUEUE_CONCURRENT

只要有空閑的線程,隊(duì)列就會(huì)調(diào)度當(dāng)前任務(wù),交給線程去執(zhí)行,不會(huì)強(qiáng)制來等待上一個(gè)任務(wù)執(zhí)行完畢,而是會(huì)在有空閑線程時(shí)來繼續(xù)調(diào)度下一個(gè)任務(wù)

串行隊(duì)列同步執(zhí)行

隊(duì)列會(huì)按順序來調(diào)度任務(wù),任務(wù)在一個(gè)線程里運(yùn)行

    dispatch_queue_t serialQueue = dispatch_queue_create( "my.serialQueue",    DISPATCH_QUEUE_SERIAL);
    dispatch_sync(serialQueue, ^{
        for (int i = 0; i < 100000; i++) {
        }
        NSLog(@"第一條%@",[NSThread currentThread]);
    });
    
    dispatch_sync(serialQueue, ^{
        for (int i = 0; i < 100000; i++) {
            if (i == 99999)
            NSLog(@"第二條%@",[NSThread currentThread]);
        }
    });
    
    dispatch_sync(serialQueue, ^{
        NSLog(@"第三條%@",[NSThread currentThread]);
    });
3091550122416_.pic.jpg

串行隊(duì)列異步執(zhí)行

按順序來調(diào)度任務(wù),任務(wù)會(huì)創(chuàng)建新的線程

    dispatch_queue_t serialQueue = dispatch_queue_create( "my.serialQueue",    DISPATCH_QUEUE_SERIAL);
    dispatch_async(serialQueue, ^{
        for (int i = 0; i < 100000; i++) {
        }
        NSLog(@"第一條%@",[NSThread currentThread]);
    });
    
    dispatch_async(serialQueue, ^{
        for (int i = 0; i < 100000; i++) {
            if (i == 99999)
            NSLog(@"第二條%@",[NSThread currentThread]);
        }
    });
    
    dispatch_async(serialQueue, ^{
        NSLog(@"第三條%@",[NSThread currentThread]);
    });
3101550122487_.pic.jpg

并行隊(duì)列同步執(zhí)行

不會(huì)等待一個(gè)任務(wù)執(zhí)行完畢便再次調(diào)度下一個(gè)任務(wù)(調(diào)度任務(wù),不控制任務(wù)的執(zhí)行),但同步任務(wù)不會(huì)開啟新的線程

    dispatch_queue_t conCurrentQueue = dispatch_queue_create( "my.conCurrentQueue",    DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(conCurrentQueue, ^{
        for (int i = 0; i < 100000; i++) {
        }
        NSLog(@"第一條%@",[NSThread currentThread]);
    });
    
    dispatch_sync(conCurrentQueue, ^{
        for (int i = 0; i < 100000; i++) {
            if (i == 99999)
            NSLog(@"第二條%@",[NSThread currentThread]);
        }
    });
    
    dispatch_sync(conCurrentQueue, ^{
        NSLog(@"第三條%@",[NSThread currentThread]);
    });
3081550122213_.pic.jpg

并行隊(duì)列異步執(zhí)行

操作會(huì)新建多個(gè)線程、操作無序執(zhí)行,不會(huì)強(qiáng)制來等待上一個(gè)任務(wù)執(zhí)行完畢,而是會(huì)在有空閑線程時(shí)來繼續(xù)調(diào)度下一個(gè)任務(wù),而此時(shí)任務(wù)會(huì)創(chuàng)建新的線程來執(zhí)行,故這種組合可以實(shí)現(xiàn)任務(wù)的并發(fā)

    dispatch_queue_t conCurrentQueue = dispatch_queue_create( "my.conCurrentQueue",    DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(conCurrentQueue, ^{
        for (int i = 0; i < 100000; i++) {
        }
        NSLog(@"第一條%@",[NSThread currentThread]);
    });
    
    dispatch_async(conCurrentQueue, ^{
        for (int i = 0; i < 100000; i++) {
            if (i == 99999)
            NSLog(@"第二條%@",[NSThread currentThread]);
        }
    });
    
    dispatch_async(conCurrentQueue, ^{
        NSLog(@"第三條%@",[NSThread currentThread]);
    });
3071550116546_.pic.jpg
?著作權(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),簡(jiǎ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,346評(píng)論 1 14
  • 從哪說起呢? 單純講多線程編程真的不知道從哪下嘴。。 不如我直接引用一個(gè)最簡(jiǎn)單的問題,以這個(gè)作為切入點(diǎn)好了 在ma...
    Mr_Baymax閱讀 2,912評(píng)論 1 17
  • 1、人像卡:代表身體某個(gè)部位的疼痛、疾病、不舒服。 與它對(duì)話一下??纯聪旅嬉l(fā)的問題是什么? 2、復(fù)原卡:代表這樣...
    顏熒梅生育哺育顧問157158閱讀 255評(píng)論 0 0
  • 汲水灌花私雨露, 臨池疊石幻溪山。
    宗林的李閱讀 477評(píng)論 4 2
  • 想寫寫Teeny,感覺心里有好多話要說給她聽。 Teeny不像Tiny一樣,天生下來就很完美,性格也不像Tiny那...
    Echo來啦閱讀 524評(píng)論 2 5

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