苹果的Cocoa框架支持的多线程机制有三中NSThread、GCD、NSOperation。
NSThread:是官方推荐的也是最主要的线程创建方式,可是须要开发这自己去管理线程的生命周期比如线程同步和内存共享等问题。
NSOperation:假设想要多个线程并行那么就须要把线程增加队列中。NSOperationQueue提供了队列的管理方法,我们能够用addOperation把线程对象以数组的形式一次性增加到队列中,而且能够设置队列的并行数量。线程运行是有序的
GCD:Grand Central DisPatch(中央调度)是Apple多核编程的解决方法。IOS4.0后引入。通过blocks实现多线程机制。
************************************************************************************************************
GCD VS NSOperation:
GCD是一种用轻量级的代码来实现的工作单元。故意于把代码合并运行。不须要手动管理,统一有系统负责调度。可是比較难实现线程之间的依赖关系。没法按序列运行。
NSOperation:比起GCD来说会添加代码量,可是能够加入线程之间的依赖关系。故意于序列化运行线程。
而且NSOperation兼容KVO。
能够设置键值监听。
线程之间同步方法:
@synchronized、NSLock、递归锁NSRecursiveLock、条件锁NSConditionLock、分布锁NSDistributedLock
》》GCD下实现多线程同步相互排斥:
GCD下的dispatch_queue队列都是FIFO(先入先出)队列。会依照队列提交树勋运行。
同步dispatch_sync、异步dispatch_async.
》》GCD下的线程分组:
dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{ // 并行运行的线程一 }); dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{ // 并行运行的线程二 }); dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{ // 汇总结果 });
》》GCD下的信号量:
信号量用来实现多个线程之间获取同一个资源的个数。当资源个数>0的时候运行操作,小于等于0的时候堵塞。
// 信号量初始化为1 dispatch_semaphore_t semaphore = dispatch_semaphore_create(1); dispatch_queue_t queue = dispatch_get_global_queue(0, 0); //1.先去网上下载图片 dispatch_async(queue, ^{ // wait操作-1 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); // 開始下载 // signal操作+1 dispatch_semaphore_signal(semaphore); }); // 2.等下载好了再在刷新主线程 dispatch_async(dispatch_get_main_queue(), ^{ // wait操作-1 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); //显示图片 // signal操作+1 dispatch_semaphore_signal(semaphore); });
》》GCD能够使处于后台执行的时间长达10分钟之久:当按home后。