GCD (純C語言) 全稱 Grand Central Dispatch,可譯為“偉大的中樞調度器”
優點:
(1) GCD是為多核的并行運算提出的解決方案
(2) GCD會自動利用更多的CPU內核(比如雙核、4核)
(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 (⑵) // 低
* DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后臺
*/
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
串行隊列:讓任務1個接1個履行,1個任務履行終了,才能履行下1個任務.
dispatch_queue_t queue = dispatch_queue_create("xiaocai", NULL);
//dispatch_release(queue); // 非ARC需要釋放手動創建的隊列
串行隊列的特殊情況:主隊列:
dispatch_get_main_queue()
補充:
同步和異步:主要影響能不能開啟新的線程
并發和串行主要影響任務的履行方式
組合方式
異步 并發隊列(最經常使用)
/**
異步(dispatch_async) 并發隊列(全局隊列)(最經常使用)
會創建線程,1次開多條, 并行的履行任務
*/
- (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) 串行隊列(有時用)
會創建線程,1般開1條, 串行的履行任務
*/
- (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"];
});
}
下一篇 數據流中的中位數