同步、异步与串行、并行的关系

前言:
做这块知识展示目的是为了帮助自己对多线程中的知识点做一个回顾,所以可能讲解上面会很简单,但是重点是要将知识点弄清晰,如果你对多线程不是很了解,那么可以看看,当然本文中如果存在错误,也欢迎大家指正。

多线程中的队列:
串行队列、 并行队列、全局队列、主队列
执行的方法:
同步执行和异步执行
线程分类:
单线程和多线程,咱们平时用的最多的就是GCD和NSOperation,他们之间的核心区别在于GCD是将一个任务添加到队列中,然后指定任务执行的方法,而NSOperation则是将一个操作添加到队列中。

废话说完了,咱们现在就来看一下,将上面的各种组合做一个排列看看结果会是怎么样的?

1.串行队列,同步执行



运行结果


执行结果可以清楚的看到全在主线程执行,并且是按照顺序执行,循环结束之后主线程的打印才输出。

2.串行队列,异步执行



运行结果


结果显示,系统开了1条异步线程,因此全部在线程3执行,并且是顺序执行。主线程打印虽然在最上面,但是这个先后顺序是不确定,如果睡个0.001秒,主线程的打印会混在中间。

3.并发队列,异步执行



运行结果


结果显示,主线程的打印还是混在中间不确定的,因为异步线程就是谁也不等谁,可以同时执行。系统开了多条线程,并且执行的顺序也是乱序的

4.并发队列,同步执行



运行结果



这个运行结果和第1种的串行队列,同步执行是一模一样的。 因为同步任务的概念就是不允许单开线程,在这里虽然他是并发的,可以允许程序同时运行,但是系统只有一条线程,所以他只能按照顺序执行,所以一旦是同步执行的,前面是什么队列都不重要了。

5.主队列,异步执行



运行结果



结果显示有点出人意料。主线程在睡会之后才打印,循环一直在等着。因为主队列的任务虽然会加到主线程中执行,但是如果主线程里也有任务就必须等主线程任务执行完才轮到主队列的。

6.主队列,同步执行



运行结果
运行结果为程序崩溃

崩溃的原因是循环等待,主队列的东西要等主线程执行完,而因为是同步执行不能开线程,所以下面的任务要等上面的任务执行完,所以卡死。

7.子线程死锁问题
子线程死锁.png

1.这里用系统create的方法创建自定义线程,按顺序先执行任务1

2.然后遇到一个异步线程,把任务2,同步线程(包含任务3),任务4这三个东西看成一体放到自定义的串行队列中,由于是异步线程,直接执行下一个任务5,因此异步线程的任务2和任务5不确定谁先谁后,但是任务1 任务2 任务5这三个东西必定会打印出来

3.看下异步线程里面,都放置在自定义的串行队列中,任务2之后遇到一个同步线程,那么线程阻塞,执行同步线程里面的任务3,由于这个队列里面放置的任务4按第二步里面的顺序率先加入进串行队列的,当同步线程执行的时候,里面的任务3是还是按照FIFO顺序加入到任务4之后,那么又造成了任务4等待任务3,任务3等待任务4的局面,又死锁了。

8.同步任务的使用场景



运行结果


结果显示,“用户登陆”在主线程打印,后两个在异步线程打印。上面的“用户登陆”使用同步执行,后面的扣费和下载都是异步执行。所以“用户登陆”必须第一个打印出来不管等多久,然后后面的两个异步和主线程打印会不确定顺序的打印。这就是日常开发中,那些后面对其有依赖的必须要先执行的任务使用同步执行,然后反正都要执行先后顺序无所谓的使用异步执行。

9.block异步任务包裹同步任务



运行结果


因为整个block是在异步执行的,所以即使里面“用户登陆”是同步执行,那也无法在主线程中执行,只能开一条异步线程执行,后面我故意将一和二任务换了一下位置。在异步执行里面,因为项目是并发的,可以同时执行,而且查看动作在用户登录前面,所以它是可以比用户登录先执行也可能比用户登录后执行,但是因为用户登录是同步执行的,所以下载任务必须要等用户登录任务先执行完他才会执行,而主线程跟整个队列里面的任务之间,因为task是异步的,所以他们之间的先后顺序也是随机的,随意主线程执行的顺序可能在任何一个位置。

10.全局队列,异步执行



运行结果


全局队列,实际上就相当于并发队列,所以并发队列异步执行,他会开启多条子线程去执行任务,并且他跟主线程之间的执行顺序也是随机的。

11.全局队列,同步执行



运行结果


全局队列,同步执行,因为同步执行它不能开启新线程,所以所有的程序只能在主线程中按照顺序依次执行。全局队列的本质就是并发队列,只是在后面加入了,“服务质量”,和“调度优先级” 两个参数,这两个参数一般为了系统间的适配,最好直接填0和0。

总结:

  1. 开不开线程,取决于执行任务的函数,同步不开,并且同步会阻塞线程等到同步任务执行完以后才会执行其他任务,异步开,异步不会阻塞线程。

  2. 开几条线程,取决于队列,串行开一条,并发开多条(异步)

  3. 主队列: 专门用来在主线程上调度任务的"队列",主队列不能在其他线程中调度任务!

  4. 如果主线程上当前正在有执行的任务,主队列暂时不会调度任务的执行!主队列同步任务,会造成死锁。原因是循环等待

  5. 同步任务可以队列调度多个异步任务前,指定一个同步任务,让所有的异步任务,等待同步任务执行完成,这是依赖关系。

  6. 全局队列:并发,能够调度多个线程,执行效率高,但是相对费电。 串行队列效率较低,省电省流量,或者是任务之间需要依赖也可以使用串行队列。

  7. 也可以通过判断当前用户的网络环境来决定开的线程数。WIFI下6条,3G/4G下2~3条。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,653评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,321评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,833评论 0 324
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,472评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,306评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,274评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,658评论 3 385
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,335评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,638评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,697评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,454评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,311评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,699评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,986评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,254评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,647评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,847评论 2 335

推荐阅读更多精彩内容