標籤:
GCD (純C語言) 全稱 Grand Central Dispatch,可譯為“偉大的中樞調度器”
優點:
(1) GCD是為多核的並行運算提出的解決方案
(2) GCD會自動利用更多的CPU核心(比如雙核、四核)
(3) GCD會自動管理線程的生命週期(建立線程、調度任務、銷毀線程)
(4) 程式員只需要告訴GCD想要執行什麼任務,不需要編寫任何線程管理代碼
核心概念:
(1) 任務(block):執行什麼任務
(2) 隊列(queue):用來存放任務
使用步驟:
(1) 定製任務:確定要執行的操作
(2) 將任務添加到隊列中: GCD 會自動將隊列中的任務取出,放到對應的線程來執行;任務的取出遵守隊列的 FIFO 原則 (先進先出).
GCD執行任務的常用函數
(1) 用同步的方式
/** * 參數說明 * @param queue 隊列 * @param void 任務 */ dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
(2) 用非同步方式
dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
同步非同步區別:
(1) 同步: 只能在當前線程中執行, 不具備開啟線程的能力
(2) 非同步: 可以在新線程中執行, 具備開啟線程的能力.
GCD隊列的類型(3種)
並發隊列(全域隊列):可以讓對個任務並發(同時)執行, 自動開啟多個線程,同時執行任務;(並發的功能只能在非同步執行的時候才有效).
/** * 優先順序 * DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高 * DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 預設(中) * DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低 * DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 後台 */ dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
串列隊列:讓任務一個接一個執行,一個任務執行完畢,才能執行下一個任務.
dispatch_queue_t queue = dispatch_queue_create("xiaocai", NULL);//dispatch_release(queue); // 非ARC需要釋放手動建立的隊列
串列隊列的特殊情況:主隊列:
dispatch_get_main_queue()
補充:
同步和非同步:主要影響能不能開啟新的線程
- 同步:不具備開啟新線程的能力
- 非同步:具備開啟線程的能力
並發和串列主要影響任務的執行方式
- 並發: 多個任務並發(同時)執行
- 串列:一個任務執行完畢,下一個任務才開始執行.
組合方式
非同步 並發隊列(最常用)
/** 非同步(dispatch_async) 並發隊列(全域隊列)(最常用) 會建立線程,一次開多條, 並行的執行任務 */- (void)createAsynGload{ //建立並發隊列(全域隊列) dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadA"]; }); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadB"]; }); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadD"]; }); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadE"]; }); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadF"]; }); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadG"]; });}
非同步 串列隊列(偶爾用)
/** 非同步(dispatch_async) 串列隊列(有時用) 會建立線程,一般開一條, 串列的執行任務 */- (void)createAsynQueue{ //建立隊列(串列隊列,依次執行) dispatch_queue_t queue = dispatch_queue_create("xiaocai", NULL); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadA"]; }); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadB"]; }); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadD"]; }); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadE"]; }); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadF"]; }); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadG"]; });}
非同步 主隊列(經常用)
/** 非同步(dispatch_async) 主隊列(很常用) 不會建立線程,在主線程中執行任務 */- (void)createAsynMainQueue{ dispatch_queue_t mianQueue = dispatch_get_main_queue(); dispatch_async(mianQueue, ^{ [self downLoad:@"http://ThreadA"]; }); dispatch_async(mianQueue, ^{ [self downLoad:@"http://ThreadB"]; }); dispatch_async(mianQueue, ^{ [self downLoad:@"http://ThreadD"]; }); dispatch_async(mianQueue, ^{ [self downLoad:@"http://ThreadE"]; }); dispatch_async(mianQueue, ^{ [self downLoad:@"http://ThreadF"]; }); dispatch_async(mianQueue, ^{ [self downLoad:@"http://ThreadG"]; });}
ios多線程 -- GCD介紹