標籤:
GCD:是純C語言寫的,是蘋果公司為多核的並行運算提出的解決方案。
GCD的兩個核心概念: - 任務 - 隊列
將任務添加到隊列中 GCD會自動將隊列中的任務取出,放到對應的線程中執行 任務的取出遵循隊列的FIFO原則:先進先出,後進後出 - 建立串列隊列
// "WE" 為線程的名稱// DISPATCH_QUEUE_SERIAL 串列dispatch_queue_t queue = dispatch_queue_create("WE",DISPATCH_QUEUE_SERIAL);// 也可以這樣設定 串列預設為NULLdispatch_queue_t queue = dispatch_queue_create("WE", NULL)
-建立隊列
//DISPATCH_QUEUE_CONCURRENT 並行dispatch_queue_t queue = dispatch_queue_create("WE", DISPATCH_QUEUE_CONCURRENT);
- 非同步執行
dispatch_async(queue, ^{// });
- 同步執行
dispatch_sync(queue, ^{//});
GCD的幾種用法 - 串列隊列,同步執行-----不開線程,同步執行
dispatch_queue_t queue = dispatch_queue_create("WE",DISPATCH_QUEUE_SERIAL); for (int i = 0; i < 5; ++i) { // 同步執行 dispatch_sync(queue, ^{ NSLog(@"%d--%@",i,[NSThread currentThread]); }); }
- 串列隊列,非同步執行-----開一個線程,順序執行
dispatch_queue_t queue = dispatch_queue_create("WE",DISPATCH_QUEUE_SERIAL); for (int i = 0; i < 5; ++i) { // 非同步執行 dispatch_async(queue, ^{ NSLog(@"%d--%@",i,[NSThread currentThread]); });}
- 並行隊列,非同步執行-----開多個線程,非同步執行
dispatch_queue_t queue = dispatch_queue_create("WE", DISPATCH_QUEUE_CONCURRENT); for (int i = 0; i < 10; ++i) {// // 非同步執行 dispatch_async(queue, ^{ NSLog(@"非同步>%d--%@",i,[NSThread currentThread]); }); }
- 並行隊列,同步執行-----不開線程,順序執行
dispatch_queue_t queue = dispatch_queue_create("WE", DISPATCH_QUEUE_CONCURRENT); for (int i = 0; i < 10; ++i) { // 同步執行 dispatch_sync(queue, ^{ NSLog(@"同步>%d--%@",i,[NSThread currentThread]); }); }
- 主隊列,非同步任務-----不開線程,同步執行
dispatch_queue_t queue = dispatch_get_main_queue(); for (int i = 0; i < 5; ++i) { // // 非同步執行 dispatch_async(queue, ^{ NSLog(@"%d--%@",i,[NSThread currentThread]); }); }
- 主隊列,同步執行-----程式執行不出來(死結) 死結的原因,當程式執行到下面這段代碼的時候
1) 主隊列:如果主線程正在執行代碼,就不調度任務
2) 同步執行:如果第一個任務沒有執行,就繼續等待第一個任務執行完成,再執行下一個任務,此時互相等待,程式無法往下執行(死結)
- 全域隊列(本質就是並發隊列)
//第一個參數:iOS7和iOS8中適配此參數 可以直接傳入0//第二個參數:為將來保留使用,始終傳入0dispatch_queue_t queue = dispatch_get_global_queue(0, 0); for (int i = 0; i < 5; ++i) { // 並存執行 dispatch_async(queue, ^{ NSLog(@"%d--%@",i,[NSThread currentThread]); });}
iOS GCD多線程介紹