Ios面试复习--多线程(GCD)

中枢调度器 多核并行运算解决方案

两个核心概念 任务 和 队列  其中队列存放任务 任务的取出遵循队列的先进先出,后进后出的原则

1.sync  和 async

其中同步和异步 主要影响作用于是否能开启新线程 

同步在当前线程中执行,不具备开启新线程能力,

异步可以在新的线程中执行,具备开启新的线程能力

Ios面试复习--多线程(GCD)_第1张图片
sync 和 async 

2.serial 和  concurrent

并发 既允许多个任务同时执行 (只在异步队列中有效)

串行 既多个任务顺序执行

3.concurrent

--1.使用 dispatch_queue_create 函数创建队列 

Ios面试复习--多线程(GCD)_第2张图片
创建并发队列

--2.GCD默认已经提供了全局的并发队列 供整个应用实用,无需手动创建

Ios面试复习--多线程(GCD)_第3张图片
全局并发队列和4种优先级

--3.同步线程 + 并发队列

不会开启新的线程 串行 没有线程谈和并发

Ios面试复习--多线程(GCD)_第4张图片
同步函数加并发队列不会开启新的线程

4.serial

--1.创建串行队列

Ios面试复习--多线程(GCD)_第5张图片
创建串行队列

--2.特殊的串行队列 主队列

只要是主队列 无论是同步函数还是异步函数 都在主线程中执行


--3.异步线程 + 串行队列

开辟一条子线程并顺序执行

Ios面试复习--多线程(GCD)_第6张图片

--4.同步线程 + 串行队列

在主线程中 顺序执行

Ios面试复习--多线程(GCD)_第7张图片

--5.同步线程 + 主队列

若当前线程为住线程 会导致线程阻塞,知道内存溢出崩溃

因为执行log1 后的代码相当于一个任务A 该任务A在主队列中顺序执行,

任务A 中的sync 会立即执行 相当于任务B 也会立即执行

无法确定A 更优先 还是B更优先 则导致 线程阻塞 

Ios面试复习--多线程(GCD)_第8张图片
当同步主线程任务在住线程中执行时会导致线程阻塞

可以归纳为

使用同步线程 向 当前串行队列中添加任务 会导致线程阻塞

Ios面试复习--多线程(GCD)_第9张图片

若当前线程不是主线程  则会 回到主线程中顺序执行

Ios面试复习--多线程(GCD)_第10张图片
新开一条子线程 执行同步住线程任务123  

5.GCD线程间的通讯

Ios面试复习--多线程(GCD)_第11张图片
异步并发线程 下载图片 完成后 异步回到主线程 设置图片

6.GCD其他常用函数

--1._barrier 系列 除了async 还有sync 

但是queue 不能是全局并发队列  

dispath_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

在全局并发队列中  barriaer 无效

Ios面试复习--多线程(GCD)_第12张图片

--2.快速迭代器 apply

Ios面试复习--多线程(GCD)_第13张图片
GCD提供一个快速迭代器,可在异步线程中 进行快速遍历

7.队列组

--1.创建一个队列组

dispatch_group_tgroup =dispatch_group_create();

--2.将多个需要执行的任务添加进队列组中

Ios面试复习--多线程(GCD)_第14张图片

--3.等待队列组中所有的任务结束调用notify

Ios面试复习--多线程(GCD)_第15张图片

--4.调用结果

调用添加进队列组内的两个异步多线程任务 直到完成后调用notify方法 最后同步住线程完成操作

Ios面试复习--多线程(GCD)_第16张图片

8.利用GCD实现一个单例

+(void)alloc 调用alloc zone 方法 所以封死zone 方法 最靠谱

若需要copy该对象,则肯定首先有对象,所以直接返回static 对象即可

Ios面试复习--多线程(GCD)_第17张图片



你可能感兴趣的:(Ios面试复习--多线程(GCD))