什么是GCD
GCD是牛逼的中樞調(diào)度器。它是純C語言,提供了很多非常強(qiáng)大的函數(shù)GCD的優(yōu)勢
它是蘋果公司為多核的并行運(yùn)算提供的解決方案
GCD會自動利用CPU的內(nèi)核
GCD會自動管理線程的生命周期(創(chuàng)建線程,調(diào)度線程,線程銷毀)
任務(wù)和隊(duì)列
GCD中的兩個核心概念
- 任務(wù):執(zhí)行什么操作
- 隊(duì)列:用于存放任務(wù)
GCD使用的兩個步驟
- 定制任務(wù)
確定想做的事情 - 將任務(wù)添加到隊(duì)列中
GCD會自動將隊(duì)列中的任務(wù)取出,放到對應(yīng)的線程中
任務(wù)的取出遵循隊(duì)列FIFO原則:先進(jìn)先出,后進(jìn)后出
執(zhí)行任務(wù)
Snip20160722_4.png
同步和異步的區(qū)別:
同步:只能在當(dāng)前線程中執(zhí)行任務(wù),不具備開啟新線程的能力
異步:可以在新的線程中執(zhí)行任務(wù),具備開啟新線程的能力
隊(duì)列的兩大類型
Snip20160722_5.png
代碼演示
/**
* 異步函數(shù) + 串行隊(duì)列 :會開啟新的線程,但是線程是串行的,一個執(zhí)行完執(zhí)行下一個
*/
- (void)asyncSerial {
// 創(chuàng)建串行隊(duì)列
dispatch_queue_t queue = dispatch_queue_create("com.pc.queue", DISPATCH_QUEUE_SERIAL);
// 或者寫NULL, NULL就是串行隊(duì)列
// dispatch_queue_t queue = dispatch_queue_create("com.pc.queue", NULL);
// 2.將任務(wù)加入隊(duì)列(async 異步)
dispatch_async(queue, ^{
NSLog(@"1----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"2----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"3----%@", [NSThread currentThread]);
});
}
/**
* 同步函數(shù) + 并發(fā)隊(duì)列 :不能開啟新的線程,肯定沒有并發(fā)能力
*/
- (void)syncConcurrent {
// 獲得全局的并發(fā)隊(duì)列
// 第一個參數(shù)是優(yōu)先級,第二個先傳0就行
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 2.將任務(wù)加入隊(duì)列(async 異步)
dispatch_sync(queue, ^{
NSLog(@"1----%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"2----%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"3----%@", [NSThread currentThread]);
});
}
/**
* 異步函數(shù) + 并發(fā)隊(duì)列 :可以同時(shí)開啟多條線程
*/
- (void)asyncConcurrent {
// 1.創(chuàng)建并發(fā)隊(duì)列, 也可以不用創(chuàng)建
// label 相當(dāng)于隊(duì)的名字 DISPATCH_QUEUE_CONCURRENT 并發(fā)
// dispatch_queue_t queue = dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT);
// 獲得全局的并發(fā)隊(duì)列
// 第一個參數(shù)是優(yōu)先級,第二個先傳0就行
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 2.將任務(wù)加入隊(duì)列(async 異步)
dispatch_async(queue, ^{
for (NSInteger i = 0; i < 10; i++) {
NSLog(@"1----%@", [NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (NSInteger i = 0; i < 10; i++) {
NSLog(@"2----%@", [NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (NSInteger i = 0; i < 10; i++) {
NSLog(@"3----%@", [NSThread currentThread]);
}
});
}
Snip20160723_1.png