GCD (純C語言) 全稱 Grand Central Dispatch,可譯為“偉大的中樞調(diào)度器”
優(yōu)點(diǎn):
(1) GCD是為多核的并行運(yùn)算提出的解決方案
(2) GCD會自動利用更多的CPU內(nèi)核(比如雙核、4核)
(3) GCD會自動管理線程的生命周期(創(chuàng)建線程、調(diào)度任務(wù)、燒毀線程)
(4) 程序員只需要告知GCD想要履行甚么任務(wù),不需要編寫任何線程管理代碼
核心概念:
(1) 任務(wù)(block):履行甚么任務(wù)
(2) 隊(duì)列(queue):用來寄存任務(wù)
使用步驟:
(1) 定制任務(wù):肯定要履行的操作
(2) 將任務(wù)添加到隊(duì)列中: GCD 會自動將隊(duì)列中的任務(wù)取出,放到對應(yīng)的線程來履行;任務(wù)的取出遵照隊(duì)列的 FIFO 原則 (先進(jìn)先出).
GCD履行任務(wù)的經(jīng)常使用函數(shù)
(1) 用同步的方式
/**
* 參數(shù)說明
* @param queue 隊(duì)列
* @param void 任務(wù)
*/
dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
(2) 用異步的方式
dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
同步異步區(qū)分:
(1) 同步: 只能在當(dāng)前線程中履行, 不具有開啟線程的能力
(2) 異步: 可以在新線程中履行, 具有開啟線程的能力.
GCD隊(duì)列的類型(3種)
并發(fā)隊(duì)列(全局隊(duì)列):可讓對個任務(wù)并發(fā)(同時)履行, 自動開啟多個線程,同時履行任務(wù);(并發(fā)的功能只能在異步履行的時候才有效).
/**
* 優(yōu)先級
* 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);
串行隊(duì)列:讓任務(wù)1個接1個履行,1個任務(wù)履行終了,才能履行下1個任務(wù).
dispatch_queue_t queue = dispatch_queue_create("xiaocai", NULL);
//dispatch_release(queue); // 非ARC需要釋放手動創(chuàng)建的隊(duì)列
串行隊(duì)列的特殊情況:主隊(duì)列:
dispatch_get_main_queue()
補(bǔ)充:
同步和異步:主要影響能不能開啟新的線程
并發(fā)和串行主要影響任務(wù)的履行方式
組合方式
異步 并發(fā)隊(duì)列(最經(jīng)常使用)
/**
異步(dispatch_async) 并發(fā)隊(duì)列(全局隊(duì)列)(最經(jīng)常使用)
會創(chuàng)建線程,1次開多條, 并行的履行任務(wù)
*/
- (void)createAsynGload{
//創(chuàng)建并發(fā)隊(duì)列(全局隊(duì)列)
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"];
});
}
異步 串行隊(duì)列(偶爾用)
/**
異步(dispatch_async) 串行隊(duì)列(有時用)
會創(chuàng)建線程,1般開1條, 串行的履行任務(wù)
*/
- (void)createAsynQueue{
//創(chuàng)建隊(duì)列(串行隊(duì)列,順次履行)
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"];
});
}
異步 主隊(duì)列(常常用)
/**
異步(dispatch_async) 主隊(duì)列(很經(jīng)常使用)
不會創(chuàng)建線程,在主線程中履行任務(wù)
*/
- (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"];
});
}