iOS多线程同步异步、串行并发浅析

原创 2017年01月03日 18:11:06

先来说一个队列和任务:

队列分为串行队列与并行队列

任务的执行分为同步执行与异步执行

这两两组合就成为了串行队列同步执行,串行队列异步执行,并行队列同步执行,并行队列异步执行

而异步是多线程的代名词,异步在实际引用中会开启新的线程,执行耗时操作。

 

那我们先来知道一个非常重要的事情:

1.队列只是负责任务的调度,而不负责任务的执行

2.任务是在线程中执行的

 

队列和任务的特点:

队列的特点:先进先出,排在前面的任务最先执行,

串行队列:任务按照顺序被调度,前一个任务不执行完毕,队列不会调度

并行队列:只要有空闲的线程,队列就会调度当前任务,交给线程去执行,不需要考虑前面是都有任务在执行,只要有线程可以利用,队列就会调度任务。

主队列:专门用来在主线程调度任务的队列,所以主队列的任务都要在主线程来执行,主队列会随着程序的启动一起创建,我们只需get即可

全局队列:是系统为了方便程序员开发提供的,其工作表现与并发队列一致,那么全局队列跟并发队列的区别是什么呢?

1.全局队列:无论ARC还是MRC都不需要考录释放,因为系统提供的我们只需要get就可以了

2.并发队列:再MRC下,并发队列创建出来后,需要手动释放dispatch_release()

同步执行:不会开启新的线程,任务按顺序执行,当一个任务没有执行完成,不会开始执行新的任务。

异步执行:会开启新的线程,任务可以并发的执行,当一个任务开始执行,下个任务不需要等待前置任务完成即可开始执行。

 

那么有这么几种组合

  1. 串行队列同步执行:综合上面阐述的串行队列的特点 --- 按顺序执行,同步:不会开启新的线程,则串行队列同步执行只是按部就班的one by one执行。
  2. 串行队列异步执行:虽然队列中存放的是异步执行的任务,但是结合串行队列的特点,前一个任务不执行完毕,队列不会调度,所以串行队列异步执行也是one by one的执行
  1. 并行队列同步执行:结合上面阐述的并行队列的特点,和同步执行的特点,可以明确的分析出来,虽然并行队列可以不需等待前一个任务执行完毕就可调度下一个任务,但是任务同步执行不会开启新的线程,所以任务也是one by one的执行
  2. 并行队列异步执行:再上一条中说明了并行队列的特点,而异步执行是任务可以开启新的线程,所以这中组合可以实现任务的并发,再实际开发中也是经常会用到的

 

GCD实现原理:

GCD有一个底层线程池,这个池中存放的是一个个的线程。之所以称为“池”,很容易理解出这个“池”中的线程是可以重用的,当一段时间后这个线程没有被调用胡话,这个线程就会被销毁。注意:开多少条线程是由底层线程池决、、、、、定的(线程建议控制再3~5条),池是系统自动来维护,不需要我们程序员来维护(看到这句话是不是很开心?)

而我们程序员需要关心的是什么呢?我们只关心的是向队列中添加任务,队列调度即可。

  • 如果队列中存放的是同步任务,则任务出队后,底层线程池中会提供一条线程供这个任务执行,任务执行完毕后这条线程再回到线程池。这样队列中的任务反复调度,因为是同步的,所以当我们用currentThread打印的时候,就是同一条线程。
  • 如果队列中存放的是异步的任务,(注意异步可以开线程),当任务出队后,底层线程池会提供一个线程供任务执行,因为是异步执行,队列中的任务不需等待当前任务执行完毕就可以调度下一个任务,这时底层线程池中会再次提供一个线程供第二个任务执行,执行完毕后再回到底层线程池中。
  • 这样就对线程完成一个复用,而不需要每一个任务执行都开启新的线程,也就从而节约的系统的开销,提高了效率。在iOS7.0的时候,使用GCD系统通常只能开5~8条线程,iOS8.0以后,系统可以开启很多条线程,但是实在开发应用中,建议开启线程条数:3~5条最为合理。
版权声明:本文为博主原创文章,未经博主允许不得转载。

GCD 术语 串行 vs. 并发 同步 vs. 异步

Serial vs. Concurrent 串行 vs. 并发 这些术语描述当任务相对于其它任务被执行,任务串行执行就是每次只有一个任务被执行,任务并发执行就是在同一时间可以有多个任务被执行。 ...
  • pilqc2009
  • pilqc2009
  • 2015年07月02日 14:39
  • 1642

帮你快速理解同步 ,异步,并发/并行,串行

同步:多个任务情况下,一个任务A执行结束,才可以执行另一个任务B。只存在一个线程。 异步:多个任务情况下,一个任务A正在执行,同时可以执行另一个任务B。任务B不用等待任务A结束才执行。存在多条线程。 ...
  • luobo140716
  • luobo140716
  • 2015年12月02日 12:53
  • 3541

线程的同步、异步、串行、并行的关系

程序是由什么构成的,可能有的人会说,它是有一个个字符和逻辑共同构成的,这个说法并不完全。 程序在没有运行的状态下,是一堆代码构成的。 运行的程序是由进程程构成的,进程是程序执行的基本单位。对于进程...
  • Future_One
  • Future_One
  • 2015年06月08日 16:23
  • 3352

Java中关于同步,异步,多线程,多线程同步,并发,并行的一些总结

1.同步与异步1.1同步在多线程的环境中,经常会碰到数据共享的情况,即当多个线程共同需要访问一个资源时,他们需要以某种顺序来确保该资源在某一时刻只能被一个线程使用,否则,程序的运行结果将是不可预料的,...
  • CSDN_FTD
  • CSDN_FTD
  • 2017年04月07日 16:11
  • 730

IOS学习 GCD 基础 串行/并行/主线程、同步/异步

@implementation ViewController - (void)viewDidLoad {     [super viewDidLoad];     // Do any ad...
  • ridxmc
  • ridxmc
  • 2016年03月30日 23:48
  • 1240

ios菜鸟关于同步、异步 并发和串行的理解

迄今为止,做IOS开发已经经历了一年有余的是
  • chuchumaoludecainiao
  • chuchumaoludecainiao
  • 2014年10月30日 10:53
  • 114

iOS中多线程知识总结:进程、线程、GCD、串行队列、并行队列、全局队列、主线程队列、同步任务、异步任务等

iOS中多线程知识总结:进程、线程、GCD、串行队列、并行队列、全局队列、主线程队列、同步任务、异步任务等(有示例代码)进程正在运行中的程序被称作进程,负责程序运行的内存分配;每一个进程都有自己独立的...
  • JacobKong
  • JacobKong
  • 2015年08月22日 12:38
  • 2731

iOS 同步 异步 并发 并行 多线程的讲解与区别

1. 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。其中两种并发关系分别是同步和互斥 2. 互斥:进程间相互排斥的使用临界资源的现...
  • baidu_31683691
  • baidu_31683691
  • 2016年01月06日 17:27
  • 3980

Java并发之串行线程池

目录目录 前言 思路 示例代码前言2016新年和两个小伙伴聊天的时候,提到了多线程排队的问题。也就是说,当服务器一个应用需要同时处理大量线程时,最好有个排队的机制,防止出现大并发失败的情况。研究生阶段...
  • zinss26914
  • zinss26914
  • 2016年01月05日 11:22
  • 2406

GCD实践——串行队列/并发队列与iOS多线程详解

1.串行队列一次只执行一个线程,按照添加到队列的顺序依次执行; 2.并发队列一次可以执行多个线程,线程的执行没有先后顺序; 3.UI界面所在的线程队列是串行队列。 下面我对上述几个案例进行代码示例...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2015年10月22日 15:12
  • 4607
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS多线程同步异步、串行并发浅析
举报原因:
原因补充:

(最多只允许输入30个字)