GCD是iOS 实现多线程编程的一种技术,使用block组织代码,高效简洁。区别于NSThread,GCD实现了高度封装,不需要程序员来管理线程的生命周期。
GCD有两个核心概念,任务和队列。
任务就是要执行的操作,就是放在block中的代码,任务的执行有两种方式:同步执行和异步执行,分别对应两个函数:dispatch_sync和dispatch_async。
两者主要区别在于,任务执行的顺序,以及是否开启新的线程。同步执行(sync),任务顺序执行,且不能开启新的线程。异步执行(async),任务并发执行,不需要等待,且可以开启新的线程。
队列,本质上是一种特殊的线性表,具有先进先出的特性。GCD中有两种队列,串行队列和并行队列。
GCD使用很简单,先指定是同步还是异步操作,然后指定队列,最后把任务放在block中即可。代码如下:
dispatch_queue_t t1 = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);//创建一个串行队列
dispatch_sync(t1,^{//同步执行
//do your job
});
同步和异步操作,串行队列和并行队列,加起来共有4种方式,总结如下:
1、串行队列+异步执行,任务在同一个子线程内顺序执行(同步执行)。
2、并行队列+异步执行, 任务在不同的子线程内交替执行(并发执行)。
由此可见异步执行,可以创建新的线程。
3、串行队列+同步执行,任务在当前线程内顺序执行(串行执行)。
4、并发队列+同步执行,任务在当前线程内顺序执行(串行执行)。
由此可见同步执行,不管是串行队列还是并发队列,用的都是当前线程,并没有创建新的线程。
系统还提供了两个非常重要的队列:全局队列和主队列。全局队列是并行队列,而主队列则是串行队列。
5、主队列+异步执行,任务在主线程内顺序执行(串行执行)。
6、主队列+同步执行,如果在主线程中,则造成死锁。如果在子线程中,则在该子线程中顺序执行(串行执行)。
注:造成死锁的原因是,在主线程中添加的同步任务,和主线程中本来的任务相互等待,阻塞了主线程,造成主线程死锁。
网友评论