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条最为合理。
版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS 多线程 进程、线程、并发、串行、同步、异步—— iOS 编码复习(四)(多线程2)

什么是线程和进程?这个问题一直困扰着我。经过多番查询、思考、总结之后,终于总结了下我自己比较通俗的说法,一块给大家说说: 1:进程是指系统正在运行的一个应用程序;每个进程之间是独立的,每个进程均运行在...

IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别

进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间       线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程 ...

iOS学习笔记74-IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别附代码

进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程   ...

C#实现多线程同步并发操作

  • 2011年07月28日 10:23
  • 2KB
  • 下载

java线程浅析[多线程同步]

java线程浅析[多线程同步] 1:什么是多线程同步? 2:怎么解决多线程同步的问题? 什么是多线程同步? 首先举一个生活中最简单的例子,公用厕所中的一个大号坑,假设每一个想上厕所的...

浅析多线程同步

问题背景 在android开发中,我们会启一个子线程去服务器获取下发数据,这个操作一般都是比较耗时的。所以对于时效性不强的数据,为了避免每次请求服务我们一般会做缓存处理。常见的缓存策略是在本地和内存...

java基础入门-多线程同步浅析-以银行转账为例子

在说之前先普及一下线程是什么? 线程:说白了就是一个任务片段 进程:是一个具有独立功能的程序关于某个数据集合的一次运行活动,一个进程有一个或者多个线程 线程与进程的本质区别就是有么有数据...

Java 多线程同步和异步详解

java线程 同步与异步 线程池 1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理。显然这是由于全局...

Java 多线程同步和异步详解

java线程 同步与异步 线程池 1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理。显然这是由于全局...

多线程同步I/O和单线程异步I/O

多线程同步I/O和单线程异步I/O 2014-08-24 同步I/O与异步I/O 线程在执行中如果遇到磁盘读写或网络通信(统称IO操作),通常要耗费较长的时间,这时OS会剥夺此线程的CPU控制权...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS多线程同步异步、串行并发浅析
举报原因:
原因补充:

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