GCD使用 並行串行隊列同步異步執行組合情況


1、異步函數和並行隊列

注意:這些任務都是在創建完之后才執行。異步函數+並發隊列,可以新建線程,各線程也是並發執行的。

 1 //第一種:系統方法創建並發隊列(全局隊列)
 2     /**
 3      *  <#Description#>
 4      *
 5      *  @param identifier#> 優先級(有四個) description#>
 6      *  @param flags#>      系統保留關鍵字,暫時寫0 description#>
 7      *
 8      *  @return <#return value description#>
 9      */
10     dispatch_queue_t queueSys = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
11     
12     //第二種:自己方法創建
13     dispatch_queue_t queueO = dispatch_queue_create("queueO", DISPATCH_QUEUE_CONCURRENT);
//並發 + 異步  number = 3, name = (null) 也就是說異步開啟子線程
    dispatch_async(queueSys, ^{
        NSLog(@"並發 + 異步 %@",[NSThread currentThread]);
    });

2、同步函數+並發隊列

注意:這些任務都是創建一個就立馬執行,執行完才創建下一個,因為是同步函數,所以不新建線程,只要是同步函數,就不會新建線程。並發隊列與否,並不影響同步函數的創建,因為本身就不能多創建線程,也就不存在並發

//並發 + 同步
    dispatch_sync(queueSys, ^{
        NSLog(@"並發 + 同步 %@",[NSThread currentThread]);
    });

3、異步函數+串行隊列

注意:這個搭配可以新建線程,但是因為是串行隊列,所以實際上也只是開了一條新線程,做完一個,再做另一個。

 1 //第一種:系統提供的串行隊列方式(串行隊列中比較實用,常用在開發中)
注意:因為主隊列是串行隊列,而且是主線程執行的,只要加到主隊列就一定是加載主線程,不論是同步還是異步
2 dispatch_queue_t queue = dispatch_get_main_queue();//主隊列 3 4 //第二種: 5 dispatch_queue_t queue1 = dispatch_queue_create("queue", 0); 6 7 //將任務添加到隊列當中 8 //串行隊列 + 異步任務:只開一個子線程 9 dispatch_async(queue1, ^{ 10 NSLog(@"串行 + 異步 %@",[NSThread currentThread]); 11 }); 12 13 /** 14 * 線程鎖死 15 * 原因1:dispatch_sync在等待任務執行完成,但是任務又被添加到主線程里,所以在主線程里執行,所以dispatch_syn在主線程中調用,就會造成鎖死 16 dispatch_queue_t queue = dispatch_get_main_queue();//主隊列 17 dispatch_sync(queue1, ^{ 18 NSLog(@"串行 + 同步 %@",[NSThread currentThread]); 19 }); 20 * 原因2:dispatch_sync是同步的,本身就會阻塞線程,就是主線程,往現在又網主線程里添加任務,就會發生鎖死,所以不用系統自帶主隊列創建,用create

嵌套也會卡死

        

//串行隊列 + 同步任務:
    dispatch_sync(queue1, ^{
       //串行隊列 + 同步任務:
        dispatch_sync(queue1, ^{
            NSLog(@"串行 + 同步 %@",[NSThread currentThread]);
        });
        NSLog(@"串行 + 同步 %@",[NSThread currentThread]);
    });

 

21      *  @return <#return value description#>
22      */

4、同步函數+串行

注意:這樣既不會開新線程,也是串行執行的

//串行隊列 + 同步任務:
    dispatch_sync(queue1, ^{
        NSLog(@"串行 + 同步 %@",[NSThread currentThread]);
    });

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM