久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

關(guān)于串行 并行 同步 異步

 昵稱597197 2017-07-20

看了很多關(guān)于這類的文章,,一直沒有總結(jié)。不總結(jié)的話就會(huì)一直糊里糊涂,,以下描述都是自己理解的非官方語(yǔ)言,,不一定嚴(yán)謹(jǐn),可當(dāng)作參考,。

首先,,進(jìn)程可理解成一個(gè)可執(zhí)行文件的執(zhí)行過程,。在ios app上的話我們可以理解為我們的app的.ipa文件執(zhí)行過程也即app運(yùn)行過程。殺掉app進(jìn)程就殺掉了這個(gè)app在系統(tǒng)里運(yùn)行所占的內(nèi)存,。

線程:線程是進(jìn)程的最小單位,。一個(gè)進(jìn)程里至少有一個(gè)主線程。就是那個(gè)main thread,。非常簡(jiǎn)單的app可能只需要一個(gè)主線程即UI線程,。當(dāng)然大部分還是會(huì)有一些子線程的,比如如果你用了AFNetWorking,,你的請(qǐng)求都是開辟了子線程,。

關(guān)于串行,并行,,同步,,異步,,我還是以下面代碼的方式做個(gè)說明,。

首先button點(diǎn)擊事件運(yùn)行在主線程里,先是在主線程里做了打印了一句話,,然后創(chuàng)建了一個(gè)串行或者并行的隊(duì)列,,之后連續(xù)創(chuàng)建了3個(gè)同步或者異步的block任務(wù)放入此隊(duì)列中,最后再在主線程里打印一句話,。

- (IBAction)serialSync:(id)sender {
  NSLog(@"start log in main thread"]);
    dispatch_queue_t myQueue = dispatch_queue_create("myQueue", NULL);
    for (NSInteger n = 0; n < 3; n++) {
        dispatch_sync(myQueue, ^{
            for (NSInteger i = 0; i < 500000000; i++) {
                if (i == 0) {
                    NSLog(@"串行同步任務(wù)%ld -> 開始%@",n,[NSThread currentThread]);
                }
                if (i == 499999999) {
                    NSLog(@"串行同步任務(wù)%ld -> 完成",(long)n);
                }
            }
        });
    }
    NSLog(@"阻塞我沒有,?當(dāng)前線程%@",[NSThread currentThread]);
}

- (IBAction)serialAsync:(id)sender {
    NSLog(@"start log in main thread"]);
    dispatch_queue_t myQueue = dispatch_queue_create("myQueue", NULL);//創(chuàng)建一個(gè)串行隊(duì)列
    for (NSInteger n = 0; n < 3; n++) {
        dispatch_async(myQueue, ^{
            for (NSInteger i = 0; i < 500000000; i++) {
                if (i == 0) {
                    NSLog(@"串行異步任務(wù)%ld -> 開始%@",n,[NSThread currentThread]);
                }
                if (i == 499999999) {
                    NSLog(@"串行異步任務(wù)%ld -> 完成",(long)n);
                }
            }
        });
    }
    NSLog(@"阻塞我沒有?當(dāng)前線程%@",[NSThread currentThread]);
}

- (IBAction)concurrentSync:(id)sender {
   NSLog(@"start log in main thread"]);
    dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
    for (NSInteger n = 0; n < 3; n++) {
        dispatch_sync(myQueue, ^{
            for (NSInteger i = 0; i < 500000000; i++) {
                if (i == 0) {
                    NSLog(@"并行同步任務(wù)%ld -> 開始%@",(long)n,[NSThread currentThread]);
                }
                if (i == 499999999) {
                    NSLog(@"并行同步任務(wù)%ld -> 完成",(long)n);
                }
            }
        });
    }

    NSLog(@"阻塞我沒有,?當(dāng)前線程%@",[NSThread currentThread]);
}
- (IBAction)concurrentAsync:(id)sender {
    NSLog(@"start log in main thread"]);
    dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
    for (NSInteger n = 0; n < 3; n++) {
        dispatch_async(myQueue, ^{
            for (NSInteger i = 0; i < 500000000; i++) {
                if (i == 0) {
                    NSLog(@"并行異步任務(wù)%ld -> 開始%@",n,[NSThread currentThread]);
                }
                if (i == 499999999) {
                    NSLog(@"并行異步任務(wù)%ld -> 完成",(long)n);
                }
            }
        });
    }
    NSLog(@"阻塞我沒有,?當(dāng)前線程%@",[NSThread currentThread]);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71

最后的結(jié)果如圖: 
這里寫圖片描述

其中我把第一句打印和最后一句打印用玫紅色表示,它們都運(yùn)行在當(dāng)前線程,。 
方框表示隊(duì)列,,3個(gè)block任務(wù)分別為3種不同的顏色。

可以看出: 
串行即上一個(gè)block任務(wù)執(zhí)行完畢下一個(gè)任務(wù)才加入到隊(duì)列中,。 
并行即其中的任務(wù)同時(shí)加入到隊(duì)列中,。

從運(yùn)行結(jié)果來看 
第一個(gè)圖只有一個(gè)主線程: 
3個(gè)block都是同步即都阻塞當(dāng)前線程,所以最后那句打印的任務(wù)就在3個(gè)block運(yùn)行完之后,。 
3個(gè)block又是串行,,所以一個(gè)一個(gè)運(yùn)行

第二個(gè)圖有2個(gè)線程即一個(gè)主線程一個(gè)子線程: 
3個(gè)block都是異步,沒有任務(wù)阻塞當(dāng)前線程,。所以最后那句打印是在第一句打印后就可以開始執(zhí)行的,。 
3個(gè)block都是異步,異步會(huì)創(chuàng)建新的線程即至少有一個(gè)子線程,。 
3個(gè)block是串行,,只有一個(gè)任務(wù)做完才會(huì)加另一個(gè)任務(wù)入隊(duì)列,,所以只需一個(gè)子線程。

第三個(gè)圖只有一個(gè)主線程: 
3個(gè)block都是同步即都阻塞當(dāng)前線程,,所以最后那句打印的任務(wù)就在3個(gè)block運(yùn)行完之后,。 
3個(gè)block是并行,同時(shí)被加入隊(duì)列中,。 
3個(gè)block都是同步,,由于同步意味著等待,所以任務(wù)的執(zhí)行表現(xiàn)為順序執(zhí)行,,其實(shí)是一起加進(jìn)去的但是等待的,,跟串行的區(qū)別是串行是別的任務(wù)做完才把它加進(jìn)隊(duì)列中。

第四個(gè)圖有多個(gè)線程: 
3個(gè)block都是異步,,沒有任務(wù)阻塞當(dāng)前線程,。所以最后那句打印是在第一句打印后就可以開始執(zhí)行的。 
3個(gè)block都是異步,,異步會(huì)創(chuàng)建新的線程即至少有一個(gè)子線程,。 
3個(gè)block是并行,需創(chuàng)建多個(gè)子線程才能保證任務(wù)同時(shí)執(zhí)行,。

再看一張圖:其中第一個(gè)異步為玫紅色,,兩個(gè)同步分別以紫色黃色表示,兩個(gè)異步分別以綠色棕色表示,,隊(duì)列后面的當(dāng)前線程動(dòng)作為橘色,。虛線代表等待。上面代表串行,,下面是并行,。

這里寫圖片描述

由此圖可以看出: 
同步block會(huì)阻塞當(dāng)前線程,即會(huì)在當(dāng)前線程中運(yùn)行,。(這里的當(dāng)前線程為主線程所以會(huì)看到UI卡?。?nbsp;
異步block會(huì)開辟新的線程。

在串行隊(duì)列中,,異步block任務(wù)用的是同一個(gè)子線程,,因?yàn)樾枰却蝿?wù)一個(gè)一個(gè)地執(zhí)行,不需要多個(gè)線程,。 
在并行隊(duì)列中,,異步block任務(wù)同時(shí)執(zhí)行,系統(tǒng)為其分配線程,。圖中的例子因第一個(gè)異步操作在第二個(gè)開始前已經(jīng)結(jié)束了,,所以并不是多少個(gè)異步操作就創(chuàng)建多少線程,主要還是看需要,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多