一、多线程
IOS中常见的多线程:
(1)pthread©:
一套通用的API,适用于Unix\Linux\Windows等系统,可跨平台可移植,使用的难度比较大。几乎不使用,但严格来说我们要是做 “加锁”,“解锁”操作的时候还是会用到pthread。
(2)NSThread(OC):
使用更加面向对象,可以直接操作线程对象,偶尔使用。
(3)GCD(Grand Central Dispatch)(C):
替代NSThread等线程技术,充分的利用了设备的多核。使用最多,更倾向使用。
(4)NSOperation(OC):
基于GCD(底层是GCD),比GCD多了一些更加实用的功能,使用起来更加面对对象,经常使用。
注意:其实NSThread、GCD、NSOperation底层都是依赖于pthread
常见面试题 :
ios常见的多线程方案有哪些?
二、GCD
GCD中有2个用来执行任务的函数
1.用 同步 的方式来执行任务(sync)
dispatch_sync(dispatch_queue_t queue,dispatch_block_t block);
queue:队列
block:任务
2.用 异步 的方式来执行任务(async)
dispatch_async(dispatch_queue_t queue,dispatch_block_t block);
GCD的队列可以分为两大类型
并发 队列:
可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)。
并发功能只有在异步(dispatch_async)下才有效。
串行队列:
让任务一个个执行,一个执行完之后才会执行下一个。
注意:GCD中通过create创建的队列不需要去释放
很容易混淆的术语
同步 异步 并发 串行
同步和异步
同步和异步的主要影响:能不能开启新的线程
同步:在当前线程中执行任务,不具备开启新线程的能力
异步:在新的线程中执行任务,具备开启新线程的能力
并发和串行
并发和串行主要影响:任务的执行方式
并发:多个任务并发(同时)执行
串行:一个任务执行完毕之后,再执行下一个任务
注意:用async 或者 sync并不影响你的任务是串行执行还是并发执行,只影响你的任务在哪一个线程 执行。他们只是用来控制 是否开启一个新的线程
队列的类型(并发队列、串行队列、主队列(也是一个串行队列))决定了任务的执行方式
也不能说用了async就一定是异步的,就一定开新线程。(一旦传入的队列是主队列)
并发队列 | 串行队列 | 主队列 | |
---|---|---|---|
同步(sync) | 没有开启新线程,串行执行任务 | 没有开启新线程,串行执行任务 | 没有开启新线程,串行执行任务 |
异步(async) | 有开启新线程,并发执行任务 | 有开启新线程,串行执行任务 | 没有开启新线程,串行执行任务 |
注意:使用sync函数往当前串行队列里添加任务会产生死锁。