亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOS多線程中,隊列和執行的排列組合結果分析

2019-11-14 19:32:06
字體:
來源:轉載
供稿:網友

本文是對以往學習的多線程中知識點的一個整理。

多線程中的隊列有:串行隊列,并發隊列,全局隊列,主隊列。

執行的方法有:同步執行和異步執行。那么兩兩一組合會有哪些注意事項呢?

如果不是在董鉑然博客園看到這邊文章請 點擊查看原文

提到多線程,也就是四種,pthread,NSthread,GCD,NSOperation  

其中phtread是跨平臺的。GCD和NSOperation都是常用的,后者是基于前者的。

但是兩者區別:GCD的核心概念是將一個任務添加到隊列,指定任務執行的方法,然后執行。 NSOperation則是直接將一個操作添加到隊列中。

為了整體結構更加清晰,我是用GCD來做此排列組合的實驗。實驗主要是通過循環內打印和主線程的打印先后順序來判斷結果,最后再加以總結

1.串行隊列,同步執行

    dispatch_queue_t q = dispatch_queue_create("dantesx", NULL);        // 執行任務    for (int i = 0; i<10; i++) {        dispatch_sync(q, ^{            NSLog(@"%@ %d", [NSThread currentThread], i);        });    }        NSLog(@"董鉑然 come here");

運行效果:

 

執行結果可以清楚的看到全在主線程執行,并且是按照數序執行,循環結束之后主線程的打印才輸出。

2.串行隊列,異步執行

    dispatch_queue_t q = dispatch_queue_create("dantesx", NULL);        for (int i = 0; i<10; i++) {        dispatch_async(q, ^{            NSLog(@"%@ %d", [NSThread currentThread], i);        });    }    //    [NSThread sleepForTimeInterval:0.001];    NSLog(@"董鉑然 come here");

 運行結果

結果顯示,系統開了1條異步線程,因此全部在線程2執行,并且是順序執行。主線程打印雖然在最上面,但是這個先后順序是不確定,如果睡個0.001秒,主線程的打印會混在中間。

3.并發隊列,異步執行

    // 1. 隊列    dispatch_queue_t q = dispatch_queue_create("dantesx", DISPATCH_QUEUE_CONCURRENT);        // 2. 異步執行    for (int i = 0; i<10; i++) {        dispatch_async(q, ^{            NSLog(@"%@ %d", [NSThread currentThread], i);        });    }    //    [NSThread sleepForTimeInterval:2.0];    NSLog(@"董鉑然 come here");

 運行結果

結果顯示,主線程的打印還是混在中間不確定的,因為異步線程就是誰也不等誰。系統開了多條線程,并且執行的順序也是亂序的

 

4.并發隊列,同步執行

    // 1. 隊列    dispatch_queue_t q = dispatch_queue_create("dantesx", DISPATCH_QUEUE_CONCURRENT);        // 2. 同步執行    for (int i = 0; i<10; i++) {        dispatch_sync(q, ^{            NSLog(@"%@ %d", [NSThread currentThread], i);        });    }    //    [NSThread sleepForTimeInterval:2.0];    NSLog(@"董鉑然 come here");

 運行結果

這個運行結果和第1種的串行隊列,同步執行是一模一樣的。 因為同步任務的概念就是按順序執行,后面都要等。言外之意就是不允許多開線程。 同步和異步則是決定開一條還是開多條。

所以一旦是同步執行,前面什么隊列已經沒區別了。

5.主隊列,異步執行

    // 1. 主隊列 - 程序啟動之后已經存在主線程,主隊列同樣存在    dispatch_queue_t q = dispatch_get_main_queue();    // 2. 安排一個任務    for (int i = 0; i<10; i++) {        dispatch_async(q, ^{            NSLog(@"%@ %d", [NSThread currentThread], i);        });    }    NSLog(@"睡會");    [NSThread sleepForTimeInterval:2.0];    NSLog(@"董鉑然 come here");

 運行結果

結果顯示有點出人意料。主線程在睡會之后才打印,循環一直在等著。因為主隊列的任務雖然會加到主線程中執行,但是如果主線程里也有任務就必須等主線程任務執行完才輪到主隊列的。

6.主隊列,同步執行

    dispatch_queue_t q = dispatch_get_main_queue();        NSLog(@"卡死了嗎?");        dispatch_sync(q, ^{        NSLog(@"我來了");    });        NSLog(@"董鉑然 come here");

 運行結果為卡死

卡死的原因是循環等待,主隊列的東西要等主線程執行完,而因為是同步執行不能開線程,所以下面的任務要等上面的任務執行完,所以卡死。這是排列組合中唯一一個會卡死的組合。

7.同步任務的使用場景

    dispatch_queue_t q = dispatch_queue_create("dantesx", DISPATCH_QUEUE_CONCURRENT);    // 1. 用戶登錄,必須要第一個執行    dispatch_sync(q, ^{        [NSThread sleepForTimeInterval:2.0];        NSLog(@"用戶登錄 %@", [NSThread currentThread]);    });    // 2. 扣費    dispatch_async(q, ^{        NSLog(@"扣費 %@", [NSThread currentThread]);    });    // 3. 下載    dispatch_async(q, ^{        NSLog(@"下載 %@", [NSThread currentThread]);    });    NSLog(@"董鉑然 come here");

 運行結果

結果顯示,“用戶登陸”在主線程打印,后兩個在異步線程打印。上面的“用戶登陸”使用同步執行,后面的扣費和下載都是異步執行。所以“用戶登陸”必須第一個打印出來不管等多久,然后后面的兩個異步和主線程打印會不確定順序的打印。這就是日常開發中,那些后面對其有依賴的必須要先執行的任務使用同步執行,然后反正都要執行先后順序無所謂的使用異步執行。

8.block異步任務包裹同步任務

    dispatch_queue_t q = dispatch_queue_create("dantesx", DISPATCH_QUEUE_CONCURRENT);    void (^task)() = ^ {        // 1. 用戶登錄,必須要第一個執行        dispatch_sync(q, ^{            NSLog(@"用戶登錄 %@", [NSThread currentThread]);        });        // 2. 扣費        dispatch_async(q, ^{            NSLog(@"扣費 %@", [NSThread currentThread]);        });        // 3. 下載        dispatch_async(q, ^{                        NSLog(@"下載 %@", [NSThread currentThread]);        });    };        dispatch_async(q, task);    [NSThread sleepForTimeInterval:1.0];    NSLog(@"董鉑然 come here");

 運行結果

因為整個block是在異步執行的,所以即使里面“用戶登陸”是同步執行,那也無法在主線程中執行,只能開一條異步線程執行,因為是同步的所以必須等他先執行,后面的“扣費”和“下載”在上面同步執行結束之后,不確定順序的打印。

9.全局隊列

    dispatch_queue_t q = dispatch_get_global_queue(0, 0);        for (int i = 0; i < 10; i++) {        dispatch_async(q, ^{            NSLog(@"%@ %d", [NSThread currentThread], i);        });    }    [NSThread sleepForTimeInterval:1.0];    NSLog(@"com here");

 運行結果

全局隊列的本質就是并發隊列,只是在后面加入了,“服務質量”,和“調度優先級” 兩個參數,這兩個參數一般為了系統間的適配,最好直接填0和0。

如果不是在董鉑然博客園看到這邊文章請 點擊查看原文

總結:

1. 開不開線程,取決于執行任務的函數,同步不開,異步開。

2. 開幾條線程,取決于隊列,串行開一條,并發開多條(異步)

3. 主隊列:  專門用來在主線程上調度任務的"隊列",主隊列不能在其他線程中調度任務!

4. 如果主線程上當前正在有執行的任務,主隊列暫時不會調度任務的執行!主隊列同步任務,會造成死鎖。原因是循環等待

5. 同步任務可以隊列調度多個異步任務前,指定一個同步任務,讓所有的異步任務,等待同步任務執行完成,這是依賴關系。

6. 全局隊列:并發,能夠調度多個線程,執行效率高,但是相對費電。 串行隊列效率較低,省電省流量,或者是任務之間需要依賴也可以使用串行隊列。

7. 也可以通過判斷當前用戶的網絡環境來決定開的線程數。WIFI下6條,3G/4G下2~3條。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩国产在线播放| 欧美性xxxxhd| 午夜美女久久久久爽久久| 亚洲午夜国产成人av电影男同| 国产一区二区三区免费视频| 亚洲一区二区在线播放| 精品视频在线播放| 国产一区二区三区毛片| 国产精品黄色影片导航在线观看| 亚洲欧洲视频在线| 一区二区三区美女xx视频| 91av中文字幕| 岛国视频午夜一区免费在线观看| 国产91精品久久久久久久| 亚洲国产精品电影| 欧美亚洲国产视频| 亚洲大胆美女视频| 欧美在线观看视频| 亚洲综合色激情五月| 中文字幕av一区中文字幕天堂| 国产精品女主播| 欧美视频中文字幕在线| 911国产网站尤物在线观看| 欧美激情在线狂野欧美精品| 亚洲第一色在线| 欧美成人免费小视频| 91色p视频在线| 国产成人一区二区三区| 正在播放国产一区| 欧美激情2020午夜免费观看| 91精品国产综合久久久久久久久| 久久精品电影网站| 91在线免费看网站| 国产精品亚洲精品| 国产一区二区在线播放| 欧美日韩人人澡狠狠躁视频| 国产精品久久久久福利| 国产精品亚洲精品| 久久精品亚洲94久久精品| 日韩久久免费电影| 欧美一区二三区| 91精品国产91久久久久久不卡| 国产又爽又黄的激情精品视频| 黄色精品在线看| 自拍偷拍亚洲欧美| 欧美在线视频一区二区| 97在线免费观看视频| 久久理论片午夜琪琪电影网| 亚洲欧美日韩一区二区三区在线| 国产精品午夜视频| 成人免费视频网| 久久伊人91精品综合网站| 国产精品久久久久久久久久东京| 国产精品一香蕉国产线看观看| 国产精品www网站| 国产suv精品一区二区三区88区| 亚洲精品国产欧美| 最近2019中文免费高清视频观看www99| 国产mv免费观看入口亚洲| 欧美老少做受xxxx高潮| 亚洲伊人久久综合| 欧美性xxxxx极品娇小| 亚洲精品www久久久久久广东| 91精品综合视频| 国产亚洲视频在线观看| 中文字幕亚洲一区二区三区| 中文字幕少妇一区二区三区| 影音先锋欧美在线资源| 亚洲免费人成在线视频观看| 欧美国产第一页| 九九视频直播综合网| 国产亚洲精品美女久久久| 国产亚洲一区二区在线| 精品久久久久久中文字幕大豆网| 久久免费少妇高潮久久精品99| 久久久久久中文字幕| 欧美成人小视频| 中文字幕v亚洲ⅴv天堂| 国产一区二区精品丝袜| 青草青草久热精品视频在线网站| 日韩国产在线播放| 亚洲国产欧美一区二区三区久久| 亚洲精品国产综合区久久久久久久| 97精品国产aⅴ7777| 黄色91在线观看| 亚洲福利视频久久| 国产精品久久一| 69av在线播放| 91免费在线视频| 久久久久久这里只有精品| 久久综合88中文色鬼| 国产在线一区二区三区| 久久久999成人| 狠狠躁夜夜躁人人躁婷婷91| 久久精品国产成人精品| 最近的2019中文字幕免费一页| 2018中文字幕一区二区三区| 69视频在线免费观看| 亚洲精品在线91| 国内精品久久久久影院 日本资源| 国产+成+人+亚洲欧洲| 成人午夜小视频| 中文字幕久精品免费视频| 国产成人精品在线| 久久精品国产成人精品| 欧美巨大黑人极品精男| 亚洲欧美日韩图片| 裸体女人亚洲精品一区| 亚洲乱亚洲乱妇无码| 欧美日韩午夜剧场| 日韩动漫免费观看电视剧高清| 亚洲香蕉成视频在线观看| 亚洲成人a级网| 欧美交受高潮1| 亚洲热线99精品视频| 久久久国产在线视频| 欧美中文在线观看| 亚洲娇小xxxx欧美娇小| 欧美亚洲激情视频| 欧美放荡办公室videos4k| 欧美日韩国产精品专区| 亚洲欧洲中文天堂| 欧美在线视频观看免费网站| 成人有码在线播放| 福利精品视频在线| 亚洲老板91色精品久久| 国产精品美女主播在线观看纯欲| 国产欧美精品日韩精品| 亚洲综合色av| 成人写真视频福利网| 国产日韩亚洲欧美| 91欧美视频网站| 亚洲国产精品va在看黑人| 日韩中文字幕在线免费观看| 97精品国产97久久久久久| 亚洲精品99久久久久中文字幕| 国产精品久久久久不卡| 久久免费观看视频| 成人日韩av在线| 麻豆国产精品va在线观看不卡| 日韩在线欧美在线国产在线| 国产91精品久久久| 国产区精品在线观看| 欧美激情二区三区| 中文综合在线观看| 日韩亚洲精品视频| 国产精品夫妻激情| 成人妇女免费播放久久久| 日韩中文av在线| 一区二区三区 在线观看视| 国产精品日韩专区| 亚洲免费电影在线观看| 久久久久亚洲精品| 欧美午夜视频一区二区| 91视频免费在线| 91社影院在线观看| 国产精品午夜国产小视频| 亚洲精品黄网在线观看| 最近2019年中文视频免费在线观看| 夜夜嗨av一区二区三区免费区| 久久精品视频免费播放| 日韩av在线天堂网| 日韩精品极品毛片系列视频| 亚州国产精品久久久|