7th,Dec,2015
多线程
“iOS中多线程使用并不复杂,关键是如何控制好各个线程的执行顺序、处理好资源竞争问题。”--KenShinCui
1.NSThread
优点:NSThread 比其他两个
轻量级
缺点:需要自己管理
线程的生命周期,
线程同步。线程同步对
数据的加锁会有一定的系统开销.并且可能会导致大量的bug.创建和维护的成本很高(引入少量或中量长期存在的线程,执行重量级的操作,比如:网络操作,数据库操作)
// m1.
// m2: 对象方法需要调用start 方法启动线程
// 在主线程中更新UI
多个线程按顺序启动,但实际执行
未必按顺序加载
照片:
1.因为线程启动后仅仅处于就绪状态,实际是否执行要由CPU根据当前状态调度。(虽然是按顺序启动,并不一定按顺序执行);
2. 每个线程执行时实际网络状况很可能不一致。
可以改变线程的优先级,线程优先级范围为0~1,值越大优先级越高,每个线程的优先级
默认为0.5。
改变最后一张图片加载的优先级,这样可以提高它被优先加载的几率,但是它也未必就第一个加载。因为首先其他线程是先启动的,其次网络状况我们没办法修改
Demo:倒计时
2.NSOperation
优点:不需要关心线程管理,数据同步[信号量,互斥锁机制]的事情,可以把精力放在自己需要执行的操作上。
Cocoa operation 相关的类是 NSOperation ,NSOperationQueue(分派队列)。
NSOperation有两个常用子类用于创建线程操作:NSInvocationOperation和NSBlockOperation,两种方式本质没有区别,但是是后者使用Block形式进行代码组织,使用相对方便。
// -(void)loadImage
//
-(
void
)
3.GCD
Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法。
时间以纳秒为单位
1)运行在主线程的Main queue,通过dispatch_get_main_queue获取。
2)并行队列【多个线程】global dispatch queue,通过dispatch_get_global_queue获取,由系统创建三个不同优先级的dispatch queue。并行队列的执行顺序与其加入队列的顺序相同。
3)串行队列【一个线程】(先进先执行)serial queues一般用于按顺序同步访问,可创建任意数量的串行队列,各个串行队列之间是并发的。
dispatch_retain和dispatch_release来控制变量的保留和释放,dispatch_susupend/dispatch_resume暂停 恢复
dispatch_async // 异步执行
分派屏障(dispatch barrier) 在并发队列内部创建一个同步点,运行时,即使有并发的条件和空闲的处理器核心,队列中的其它块也不能运行.没有屏障的可以看做共享(读取)锁.
@synchronize 管理多线程访问,会在参数上加一个互斥锁. 易用,但当竞争很少时成本很高
4.锁机制
多个线程
并发执行,可能出现同时访问同一资源,造成资源抢夺。
解决方法:
1.NSLock同步锁
2. @synchronized代码块
未完待续 今天要早点休息...
参考资料:
iOS开发系列--并行开发其实很容易