现在的位置: 首页 > 综合 > 正文

IOS_多线程

2018年02月02日 ⁄ 综合 ⁄ 共 1607字 ⁄ 字号 评论关闭

苹果的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后。


抱歉!评论已关闭.