【iOS面试系列-2】多线程中同步、异步和串行、并行之间的逻辑关系(必考,必须掌握)

一、同步、异步和串行、并行

任务串行执行就是每次只有一个任务被执行,任务并发执行就是在同一时间可以有多个任务被执行。

一个同步函数只在完成了它预定的任务后才返回。一个异步函数,刚好相反,会立即返回,预定的任务会完成但不会等它完成。因此,一个异步函数不会阻塞当前线程去执行下一个函数。

  (来源:http://www.cocoachina.com/industry/20140428/8248.html)

  队列分为串行和并行

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

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

  ------- 任务是在线程中执行的  ---------

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

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

  同步执行:不会开启新的线程,任务按顺序执行

  异步执行:会开启新的线程,任务可以并发的执行

  (来源:http://www.cnblogs.com/KongPro/p/5193175.html)

  【注:两人说的有矛盾,一个说队列执行任务,一个说队列不执行任务= =一个说同步异步是返回的问题,一个说同步异步是开不开线程的问题】

  同步(sync)异步(async) 的主要区别在于会不会阻塞当前线程,直到 Block 中的任务执行完毕!
  如果是 同步(sync) 操作,它会阻塞当前线程并等待 Block 中的任务执行完毕,然后当前线程才会继续往下运行。
  如果是 异步(async)操作,当前线程会直接往下执行,它不会阻塞当前线程。

  (原文链接:http://www.jianshu.com/p/0b0d9b1f1f19)

  【第三个人和第一个人的意思差不多】

二、队列

  GCD 提供有 dispatch queues 来处理代码块,这些队列管理你提供给 GCD 的任务并用 FIFO 顺序执行这些任务。这就保证了第一个被添加到队列里的任务会是队列中第一个开始的任务,而第二个被添加的任务将第二个开始,如此直到队列的终点。

  1、串行队列

    唯一能确保的事情是 GCD 一次只执行一个任务,并且按照我们添加到队列的顺序来执行。由于在串行队列中不会有两个任务并发运行。

  放到串行队列的任务,GCD 会 FIFO(先进先出) 地取出来一个,执行一个,然后取下一个,这样一个一个的执行。

  2、并发队列

    在并发队列中的任务能得到的保证是它们会按照被添加的顺序开始执行,任务可能以任意顺序完成,你不会知道何时开始运行下一个任务,或者任意时刻有多少 Block 在运行。再说一遍,这完全取决于 GCD 。

    放到并行队列的任务,GCD 也会 FIFO的取出来,但不同的是,它取出来一个就会放到别的线程,然后再取出来一个又放到另一个的线程。这样由于取的动作很快,忽略不计,看起来,所有的任务都是一起执行的。不过需要注意,GCD 会根据系统资源控制并行的数量,所以如果任务很多,它并不会让所有任务同时执行。

(来源:http://www.cocoachina.com/industry/20140428/8248.html)

  (原文链接:http://www.jianshu.com/p/0b0d9b1f1f19)

三、组合

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

  (来源:http://www.cnblogs.com/KongPro/p/5193175.html)

  【个人总结:串行、并行区别就是有任务在执行时能不能让新的任务去执行

        同步、异步区别是会不会阻塞当前线程

        串行同步:取出一个任务,阻塞当前线程,任务执行完毕,任务执行完毕,下一个任务

        串行异步:取出一个任务,不阻塞当前线程,不等任务执行完成,任务执行完毕,下一个任务

        并行同步:取出来一个任务,阻塞当前线程,任务执行完毕,不等任务执行完毕,下一个任务

        并行异步:取出来一个任务,不阻塞当前线程,不等任务执行完成,不等任务执行完成,下一个任务

  】

  【所以现在最大的问题是,如果只有一个线程去异步的执行一个并行队列里的任务,会是怎样?感觉上来说,不开线程的话就是同步,一旦叫异步就说明开了线程,所以把这三个人的总结起来才比较合理】

let queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL)  //创建串行队列

   NSLog("之前 - %@", NSThread.currentThread())

    dispatch_async(queue, { () -> Void in      //异步执行串行队列-开了一个新的线程
        NSLog("sync之前 - %@", NSThread.currentThread())
        dispatch_sync(queue, { () -> Void in   //同步执行串行队列-阻塞当前线程并等待上一个任务执行完毕(而上一个任务就是阻塞的这个)
             NSLog("sync - %@", NSThread.currentThread())
        })
        NSLog("sync之后 - %@", NSThread.currentThread())
   })

  NSLog("之后 - %@", NSThread.currentThread())

  【博客上找来的还是不放心,有时间在书上看到相关的我会再来更新】

时间: 2024-10-13 00:06:42

【iOS面试系列-2】多线程中同步、异步和串行、并行之间的逻辑关系(必考,必须掌握)的相关文章

iOS-线程之GCD方式---之同步异步和串行队列并行队列之间的关系

GCD方式是Apple官方推荐实现多线程的方式 但在这之前必须理清楚同步,异步,串行队列,并行队列之间的概念. 同步:即当前的执行程序块不会创建一个新的线程,只能在当前线程中执行. 异步:会在当前的线程之外创建一个新的线程,并在新的线程中执行代码块. 首先声明一点,队列是用来存放即将执行的线程体的. 串行队列:串行队列中的线程满足FIFO(First In First Out),并且只有在先出的线程执行完,后续的线程才能出队列执行.(很可能造成APP的假死状态) 并行队列:并行队列也满足FIFO

【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例(转载)

(1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时间的任务 /** * 因为是异步,所以开通了子线程,但是因为是串行队列,所以只需要开通1个子线程(2),它们在子线程中顺序执行.最常用. */ -(void)gcdDemo1{ dispatch_queue_t q1=dispatch_queue_create("com.hellocation.gcdDemo", DISPATCH_QUEUE_SERIAL); for

GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

转:http://www.tuicool.com/articles/NVVnMn (1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时间的任务 /** * 因为是异步,所以开通了子线程,但是因为是串行队列,所以只需要开通1个子线程(2),它们在子线程中顺序执行.最常用. */ -(void)gcdDemo1{ dispatch_queue_t q1=dispatch_queue_create("com.hellocation.gc

iOS多线程——同步异步串行并行

串行并行异步同步的概念很容易让人混淆,关于这几个概念我在第一篇GCD中有解释,但是还不够清晰,所以这里重写一篇博客专门对这几个概念进行区分: 先说一下队列和任务: (1)队列分为串行和并行,任务的执行分为同步和异步,异步是多线程的代名词,异步在实际引用中会开启新的线程,执行耗时操作. (2)队列只是负责任务的调度,而不负责任务的执行,任务是在线程中执行. 以上两点对了解串行.并行.同步.异步非常重要! 再说一下队列和任务的特点: (1)串行队列:任务按照顺序被调度,前一个任务不执行完毕,队列不会

IO中同步异步,阻塞与非阻塞

一.同步与异步 同步/异步, 它们是消息的通知机制 1. 概念解释 A. 同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如sin isdigit等). 但是一般而言,我们在说同步.异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务. 最常见的例子就是 SendMessage. 该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回. 当对方处理完毕以后,该函数才把消息处理函数所返回的值返回给调

进程 线程 多线程 并发 同步异步

进程 线程 多线程 并发 同步异步 很多人对进程,线程,多线程,并发,同步,异步等概念感到困惑,这都是大学没好好听课的缘故啊.咱在这里帮感到概念给感到困惑的同学复习下. 程序 程序用来描述计算机所完成的独立功能,并在时间上严格地按前后次序相继地进行计算机操作序列集合,是一个静态概念. 进程 并发执行的程序在执行过程中分配和管理资源的基本单位.是一个动态的执行过程. 进程的静态描述 进程控制块PCB 有关程序段 该程序员对齐进行操作的数据结构集 进程控制块PCB 进程控制块PCB是系统管制进程存在

IO中同步异步,阻塞与非阻塞 -- 原理篇

再补一篇高手写的理论分析,便于更深刻理解 转自:http://blog.csdn.net/historyasamirror/article/details/5778378 ============================================================= 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答

异步任务+并行队列情况与异步任务+串行队列(主队列)情况

异步任务+并行队列 把异步任务放到并行队列进行执行,异步任务会在不同的线程中执行. /*异步执行+并行队列*/ - (IBAction)clickBasic1:(UIButton *)sender { //全局并行队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //异步执行 dispatch_async(queue, ^{ for (int i = 0; i<2;

wemall app商城源码中基于JAVA的T绑定和处理fragments和viewpager之间的逻辑关系代码

wemall doraemon是Android客户端程序,服务端采用wemall微信商城,不对原商城做任何修改,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可随意定制修改.本文分享其中关于为ViewPager添加布局(Fragment),绑定和处理fragments和viewpager之间的逻辑关系,供技术员参考学习. package com.inuoer.util; import java.util.List; import android.support.v4.app.Fra