一 GCD 的好处:
1)GCD 可用于多核的并行运算
2)GCD 会自动利用更多的 CPU 内核(比如双核、四核)
3)GCD 会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
4)程序员只需要告诉 GCD 想要执行什么任务,不需要编写任何线程管理代码
二 GCD 的任务
1 同步执行(sync):
同步添加任务到指定的队列中,在添加的任务执行结束之前,会一直等待,直到队列里面的任务完成之后再继续执行。
只能在当前线程中执行任务,不具备开启新线程的能力。
2 异步执行(async):
异步添加任务到指定的队列中,它不会做任何等待,可以继续执行任务。
可以在新的线程中执行任务,具备开启新线程的能力。
3 注意:异步执行(async)虽然具有开启新线程的能力,但是并不一定开启新线程。这跟任务所指定的队列类型有关
三 GCD 的队列
1 采用 FIFO(先进先出)的原则。
2 串行队列(Serial Dispatch Queue):
每次只有一个任务被执行。让任务一个接着一个地执行。(只开启一个线程,一个任务执行完毕后,再执行下一个任务)
3 并发队列(Concurrent Dispatch Queue):
可以让多个任务并发(同时)执行。(可以开启多个线程,并且同时执行任务)
4 注意:并发队列的并发功能只有在异步(dispatch_async)函数下才有效
四 GCD 的使用步骤
1 创建一个队列(串行队列或并发队列)
2 将任务追加到任务的等待队列中,然后系统就会根据任务类型执行任务(同步执行或异步执行)
1)创建队列的方法:
1 dispatch_queue_create来创建队列,需要传入两个参数,第一个参数表示队列的唯一标识符,用于 DEBUG,可为空,Dispatch Queue 的名称推荐使用应用程序 ID 这种逆序全程域名;第二个参数用来识别是串行队列还是并发队列。DISPATCH_QUEUE_SERIAL 表示串行队列,DISPATCH_QUEUE_CONCURRENT 表示并发队列。
2 例子:
// 串行队列的创建方法
dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_SERIAL);
// 并发队列的创建方法
dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_CONCURRENT);
3 特殊的串行队列:
主队列(Main Dispatch Queue)。
所有放在主队列中的任务,都会放到主线程中执行。
可使用dispatch_get_main_queue()获得主队列。
// 主队列的获取方法
dispatch_queue_t queue = dispatch_get_main_queue();
4 全局并发队列(Global Dispatch Queue):
可以使用dispatch_get_global_queue来获取。需要传入两个参数。第一个参数表示队列优先级,一般用DISPATCH_QUEUE_PRIORITY_DEFAULT。第二个参数暂时没用,用0即可。
// 全局并发队列的获取方法
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
5 任务的创建方法
// 同步执行任务创建方法
dispatch_sync(queue, ^{
// 这里放同步执行任务代码
});
// 异步执行任务创建方法
dispatch_async(queue, ^{
// 这里放异步执行任务代码
});
6 6种组合方式
6.1 同步执行 + 并发队列
在当前线程中执行任务,不会开启新线程,执行完一个任务,再执行下一个任务。
6.2 异步执行 + 并发队列
可以开启多个线程,任务交替(同时)执行。
6.3 同步执行 + 串行队列
不会开启新线程,在当前线程执行任务。任务是串行的,执行完一个任务,再执行下一个任务。
6.4 异步执行 + 串行队列
会开启新线程,但是因为任务是串行的,执行完一个任务,再执行下一个任务
6.5 同步执行 + 主队列
在不同线程中调用结果也是不一样,在主线程中调用会出现死锁,而在其他线程中则不会。
6.6 异步执行 + 主队列
只在主线程中执行任务,执行完一个任务,再执行下一个任务。
五 GCD 线程间的通信 (其实就是线程的嵌套,比如在子线程完成了耗时操作,回到主线程刷新UI,就是在子线程中嵌套主线程中刷新一下UI)。
六 GCD 的其他方法
1 GCD 栅栏方法:dispatch_barrier_async (就是把任务分成前后两段来执行,第一段所有任务执行完了,采取执行第二段)
2
网友评论