美文网首页
2019-11-19 ios多线程之GCD(一)

2019-11-19 ios多线程之GCD(一)

作者: 北你妹的风 | 来源:发表于2019-11-18 14:58 被阅读0次

    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、主队列+同步执行,如果在主线程中,则造成死锁。如果在子线程中,则在该子线程中顺序执行(串行执行)。

    注:造成死锁的原因是,在主线程中添加的同步任务,和主线程中本来的任务相互等待,阻塞了主线程,造成主线程死锁。

    相关文章

      网友评论

          本文标题:2019-11-19 ios多线程之GCD(一)

          本文链接:https://www.haomeiwen.com/subject/bntbictx.html