简介
单线程中一个线程只能做一件事情,一件事情处理不完另一件事情就不能开始,显然这样的程序是失败的,早在单核处理器时期就有了多线程,这个时候多线程更多的是处理线程阻塞造成的用户等待(通常是操作完UI后,用户不在干涉,其它线程在等待队列中,CPU一旦空闲就继续执行,不影响用户其它UI操作)其处理能力并没有明显的变化,如今已到了多核处理器时代,于是“并行运算”更多的被提及。在iOS中每个进程启动都会建立一个主线程(UI主线程),这个线程是其它线程的父线程,由于在iOS中除了主线程,其它子线程是独立于Cocoa Touch的,所有只有UI主线程可以更新界面
NSThread
NSThread是轻量级的多线程开发,使用比较简单,但是使用NSThread需要自己管理线程的生命周期
解决线程阻塞问题
NSOperation
GCD(Grand Central Dispatch)
GCD是基于C语言开发的一套多线程开发机制,也是目前苹果官方最推崇的多线程研发方法,GCD是完全面向过程的,
GCD中也有类似NSOperation的队列,GCD统一管理整个队列中的任务,GCD中的队列分为并行队列和串行队列
串行队列
首先创建串行队列,然后调用异步调用方法,在此方法中传入串行队列和线程操作即可自动执行,
并行队列
使用并发队列使用dispatch_queue_create()方法创建,只是最后一个参数指定为DISPATCH_QUEUE_CONCURRENT进行创建,但是实际开发中我们通常不会重新创建一个并发队列,而是使用dispatch_get_global_queue()方法取得一个全局的并发队列,(当然如果有多个并发队列可以使用前者创建)。
结论
GCD中一个操作是多线程执行还是单线程执行取决于当前队列类型和执行方法,只有队列类型为并行队列并且使用异步方法执行时才能在多线程中执行
串行队列可以按顺序执行,并行队列的异步方法无法确定执行顺序
UI界面的更新最好采用同步方法,其它操作采用异步方法
GCD中多线程操作方法不需要@autoreleasepool,GCD会管理内存
dispatch_queue_create()
线程同步
总结
开始之前我们介绍几个函数
dispatch_async(dispatch_get_global_queue(0, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
});
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
dispatch_async起一个新的线程进行异步操作,queue是将任务添加到指定的GCD队列中去,block是分配处理该事务的程序块到该队列。
一般系统自身有三个队列
dispatch_get_global_queue(0, 0) // 全局队列
dispatch_get_main_queue() // 主线程队列
dispatch_get_current_queue() // 当前队列
dispatch_async开启一个异步操作,第一个参数是指定一个gcd队列,第二个参数是分配一个处理事物的程序块到该队列。