杨小麦OC之旅--多线程


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开发系列--并行开发其实很容易





你可能感兴趣的:(杨小麦OC之旅--多线程)