GCD:串行/并行/主隊列下,同步/異步的執行方式

喜歡我的可以關注收藏我的個人博客:RobberJJ

GCD中獲取各種類型的隊列:

//獲取串行的隊列  
dispatch_queue_t singalQueue = dispatch_queue_create("single",DISPATCH_QUEUE_SERIAL);
//獲取并發執行的隊列
dispatch_queue_t concrtQueue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
//獲取主隊列
dispatch_queue_t mainQueue =  dispatch_get_main_queue();
//獲取全局的隊列(并發的)
dispatch_queue_t gobalqueue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

<h6>串行隊列異步執行任務</h6>

  1. 異步具有創建新線程的能力,會開辟新線程去執行任務;
  1. 按照串行的方式去執行任務。

如下調用方式可參考:
- (void)singalAsynQueue{
//創建串行隊列
dispatch_queue_t singalQueue = dispatch_queue_create("singal", DISPATCH_QUEUE_SERIAL);
//在singalQueue中異步執行任務(該方法實現在本文后續中)
[self asynWithQueue: singalQueue];
}

<h6>串行隊列同步執行任務</h6>

  1. 同步不具有創建新的線程的能力, 不會開辟新的線程去執行任務,會在當前的程序的主線程中去執行任務;
  1. 按照串行的方式去執行任務。

如下調用方式可參考:
- (void)singalSynQueue{
//創建串行隊列
dispatch_queue_t singalQueue = dispatch_queue_create("singal", DISPATCH_QUEUE_SERIAL);
//在singalQueue中同步執行任務(該方法實現在本文后續中)
[self synWithQueue: singalQueue];
}

<h6>并發隊列異步執行任務(常用)</h6>

  1. 異步具有創建新的線程的能力,會開辟新的線程去執行任務,不會在當前的程序的主線程中去執行任務;
  1. 按照并發的方式去執行任務。

如下調用方式可參考:
- (void)concrtAsynQueue{
//創建并發執行的隊列
// dispatch_queue_t concrtQueue = dispatch_queue_create("concrtQueue", DISPATCH_QUEUE_CONCURRENT);
//獲取全局的隊列
dispatch_queue_t concrtQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//在concrtQueue中異步執行任務(該方法實現在本文后續中)
[self asynWithQueue:concrtQueue];
}

<h6>并發隊列同步執行任務</h6>

  1. 同步不具有創建新的線程的能力, 不會開辟新的線程去執行任務,會在當前的程序的主線程中去執行任務;
  1. 按照同步的方式去執行任務。

如下調用方式可參考:
- (void)concrtSynQueue{
//創建并發執行的隊列
// dispatch_queue_t concrtQueue = dispatch_queue_create("concrtQueue", DISPATCH_QUEUE_CONCURRENT);
//獲取全局的隊列
dispatch_queue_t concrtQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//在concrtQueue中同步執行任務(該方法實現在本文后續中)
[self synWithQueue:concrtQueue];
}

<h6>主隊列的同步(會造成程序的死鎖)</h6>

如下:
- (void)mainSynQueue{
//獲取主隊列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//在mainQueue中同步執行任務(該方法實現在本文后續中)
[self synWithQueue:mainQueue];
}

<h6>主隊列的異步(在主線程中順序執行)</h6>

新添加到主隊列中的任務會放到隊列的最尾部,等到當前主線程中的任務結束之后然后再從隊列的頭部取出依次執行(FIFO)先進先出。

如下調用方式可參考:
- (void)mainAsynQueue{
//獲取主隊列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//在mainQueue中異步執行任務(該方法實現在本文后續中)
[self asynWithQueue:mainQueue];
}

<h6>異步方法的實現</h6>

- (void)asynWithQueue:(dispatch_queue_t)queue{
    NSLog(@"%@",[NSThread currentThread]);
    
    dispatch_async(queue, ^{
        NSLog(@"----1----%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"----2----%@",[NSThread currentThread]);
    });

    dispatch_async(queue, ^{
        NSLog(@"----3----%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"----4----%@",[NSThread currentThread]);
    });
    
    NSLog(@"--------end------------");
}

<h6>同步方法的實現</h6>

- (void)synWithQueue:(dispatch_queue_t)queue{
    NSLog(@"%@",[NSThread currentThread]);
    
    dispatch_sync(queue, ^{
        NSLog(@"----1----%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"----2----%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"----3----%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"----4----%@",[NSThread currentThread]);
    });
    
    NSLog(@"--------end------------");
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容