[TOC]
GCD 简介
全称Grand Central Dispatch
,可译为“牛逼的中枢调度器”。
GCD 优势
- GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
- GCD是苹果公司为多核的并行运算提出的解决方案
- GCD会自动利用更多的CPU内核(比如双核、四核)
- 程序员只需要告诉GCD想要执行什么任务,不需要编写任何管理线程代码
GCD的底层实现
主要有Dispatch Queue和Dispatch Source
GCD 核心概念:任务
+ 队列
区别 | 并行队列 | 自定义串行队列 | 主队列 |
---|---|---|---|
同步 | 没有开启新线程,串行执行 | 没有开启新线程,串行执行 | 没有开启新线程,串行执行 |
异步 | 开启新线程,并行执行 | 开启新线程,串行执行 | 没有开启新线程,串行执行 |
任务
:需要执行的操作
创建的任务有 同步(sync) 和 异步(async) 两种执行方式。
区别 | 同步执行 | 异步执行 |
---|---|---|
是否等待任务执行完毕后再继续 | 是 | 否 |
开启新线程的能力 | 不具备 | 具备 |
dispatch_sync(dispatch_get_global_queue(0, 0), ^{
NSLog(@"同步执行");
});
复制代码
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"异步执行");
});
复制代码
队列
:存放任务的地方
队列也分为两种串行和并行。
区别 | 串行 | 并行 |
---|---|---|
取任务的方式 | 一次职能取出一个任务执行完毕后,才能执行下一个 | 一次可以取出多个任务同时执行 |
开启新线程的能力 | 只开启一个线程(或者不开启,在当前线程执行) | 可以开启多个线程,并同时执行 |
并发队列只有在异步函数下才有效。
系统Queue
Main Dispatch Queue(主队列 + 串行)
dispatch_get_main_queue()
复制代码
Global Dispatch Queue(全局队列 + 并行)
自定义Queue
//创建了一个并行队列
dispatch_queue_t queue = dispatch_queue_create("com.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);
//创建了一个串行队列
dispatch_queue_t queue = dispatch_queue_create("com.serial.queue", DISPATCH_QUEUE_SERIAL);
复制代码
使用GCD的步骤就是创建任务,然后把任务添加到队列中,GCD会自动从队列中取出任务放到线程中去执行。