GCD并不是多线程技术 而是并发解决技术
简介:
什么是GCD?--全称是 Grand Central Dispatch ,可译为“牛逼的中枢调度器”
纯C语言,提供了非常强大的函数
GCD的优势
1. GCD是苹果公司为多核的并行运算提出的解决方案
2. GCD会自动利用更多的CPU内核(比如双核、四核)
3. GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
4. 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码
GCD中有2个核心概念
1. 任务:执行什么操作
2. 队列:用来存放任务
GCD的使用就2个步骤
1. 定制任务 -- (确定想做的事情)
2. 将任务添加到队列中
* GCD会自动将队列中的任务取出,放到对应的线程中执行
* 任务的取出遵循队列的FIFO原则:先进先出,后进后出
GCD 常见代码
同步执行方法,这句话不执行完,就不会执行下一任务,同步执行不会开启线程
//1.创建队列
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
//2.任务添加到队列中
//2.1 定义任务 -- block
void(^task)() = ^() {
NSLog(@"%@",[NSThread currentThread]);
};
//2.2 添加任务到队列,并且会执行
dispatch_sync(q, task);
异步执行任务 如果任务没有执行完毕,可以不用等待,异步执行下一个任务
具备开启线程的能力! 异步通常又是多线程的代名词
//1.创建队列
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
//2.定义任务 block
void(^task)() = ^() {
NSLog(@"%@",[NSThread currentThread]);
};
//3.添加任务到队列
dispatch_async(q, task);
GCD的方法
// 指定任务执行方法 -- 异步
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//耗时操作
NSLog(@"%@",[NSThread currentThread]);
//主队列 就是专门负责在主线程上调度任务的队列
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"更新UI %@",[NSThread currentThread]);
});
});
GCD 核心概念:将任务添加到队列,指定任务执行的方法
- 任务
- 使用block 封装
- block 就是一个提前准备好的代码块,在需要的时候执行
- 队列
- 串行队列:一个接一个的调度任务
- 并发队列:可以同时调度多个任务
- 任务执行函数(任务都需要在线程中执行!!!)
- 同步执行:当前指令不完成,不会执行下个任务
- 异步执行:当前指令不完成,可移执行下一条指令
//MARK:串行队列,同步任务
// 1.队列 - 串行
/**
1. 队列的名称:
2. 队列的属性:NULL / DISPATCH_QUEUE_SERIAL 串行队列
*/
dispatch_queue_t q = dispatch_queue_create("WBC", NULL);
// 2.同步执行任务
dispatch_sync(q, ^{
NSLog(@"%@",[NSThread currentThread]);
});
//MARK:串行队列,异步任务
// 1.队列 - 串行
dispatch_queue_t q = dispatch_queue_create("WBC", NULL);
dispatch_async(q, ^{
NSLog(@"%@",[NSThread currentThread]);
});
//MARK:并发队列,同步执行
/**
1. 队列的名称:
2. 队列的属性:DISPATCH_QUEUE_CONCURRENT 并发队列
*/
dispatch_queue_t q = dispatch_queue_create("WBC", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(q, ^{
NSLog(@"%@",[NSThread currentThread]);
});
//MARK:并发队列,异步执行
dispatch_queue_t q = dispatch_queue_create("WBC", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(q, ^{
NSLog(@"%@",[NSThread currentThread]);
});
小结:
- 开不开线程,取决于执行任务的函数,同步不开,异步才可能开
- 开几条线程,取决于队列,串行开一条,并发可以开多条(异步)
网友评论