GCD:Grand Central Dispatch 官方翻译:多线程优化技术 ,俗称牛逼的中枢调度器。是Apple开发的一个多核编程的解决方法,GCD是苹果公司为多核的并行运算提出的解决方案。
GCD的优势:
1.GCD会自动利用更多的CPU内核(比如双核、四核)
2.GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
3.程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码(使用方便)
1.基础并重要的两个函数及队列
// 创建队列与获得全局的并发队列
2.创建队列的函数的使用
//创建串行队列
// 第一个参数:队列的名称,标识
// 第二个参数:队列的类型( 创建串行队列,队列类型传递NULL或者DISPATCH_QUEUE_SERIAL))
dispatch_queue_t queue1 = dispatch_queue_create("串行队列", DISPATCH_QUEUE_SERIAL);
//主队列是GCD自带的一种特殊的串行队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//创建并发队列
// 第一个参数:队列的名称,标识
// 第二个参数:队列的类型
dispatch_queue_t queue2 = dispatch_queue_create("并发队列", DISPATCH_QUEUE_CONCURRENT);
//获取GCD自带的一种并发的全局队列
// 第一个参数:队列的优先级(默认优先级传0即可)
// 第二个参数:传0即可
dispatch_queue_t globleQueue = dispatch_get_global_queue(0, 0);
// 全局并发队列的优先级
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中)
#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台
3.同步异步函数与队列的使用
关于同步函数和异步函数与串行队列与并发队列的对执行任务的影响
同步和异步主要影响:能不能开启新的线程
同步:只是在当前线程中执行任务,不具备开启新线程的能力
异步:可以在新的线程中执行任务,具备开启新线程的能力
并发和串行主要影响:任务的执行方式
并发:允许多个任务并发(同时)执行
串行:一个任务执行完毕后,再执行下一个任务
//同步函数+并发队列:不会开线程,任务是串行执行的
-(void)syncConcurrent
{
//1.创建队列
dispatch_queue_t queue = dispatch_queue_create("downloadTask", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"---start---");
//2.封装任务
dispatch_sync(queue, ^{
NSLog(@"download1----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"download2----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"download3----%@",[NSThread currentThread]);
});
NSLog(@"---end---");
}
//同步函数+串行队列:不会开线程,任务是串行执行的
-(void)syncSerial
{
//1.创建队列
dispatch_queue_t queue = dispatch_queue_create("downloadTask", DISPATCH_QUEUE_SERIAL);
//2.封装任务
dispatch_sync(queue, ^{
NSLog(@"download1----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"download2----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"download3----%@",[NSThread currentThread]);
});
}
//异步函数+主队列:所有任务都在主线程中执行,不会开线程
-(void)asyncMain
{
//1.获得主队列
dispatch_queue_t queue = dispatch_get_main_queue();
//2.异步函数
dispatch_async(queue, ^{
NSLog(@"download1----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"download2----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"download3----%@",[NSThread currentThread]);
});
}
//同步函数+主队列:死锁
//注意:如果该方法在子线程中执行,那么所有的任务在主线程中执行,
-(void)syncMain
{
//1.获得主队列
dispatch_queue_t queue = dispatch_get_main_queue();
NSLog(@"start----");
//2.同步函数
//同步函数:立刻马上执行,如果我没有执行完毕,那么后面的也别想执行
//异步函数:如果我没有执行完毕,那么后面的也可以执行
dispatch_sync(queue, ^{
NSLog(@"download1----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"download2----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"download3----%@",[NSThread currentThread]);
});
NSLog(@"end---");
}
4.线程中的通信
//从子线程回到主线程
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 执行耗时的异步操作...
dispatch_async(dispatch_get_main_queue(), ^{
// 回到主线程,执行UI刷新操作
});
});