IOS多线程

IOS支持多个层次的多线程编程,层次越高的抽象成都越高,使用起来越更方便。

1、NSTread

       Thread是这三种里面相对轻量级的,使用起来最复杂的,需要自己管理thread的生命周期,线程之间的同步。线程共享同一应用程序的部分内存空间,他们拥有对数据相同的访问权限,你得协调多个线程对同一数据的访问,一般在访问之前加锁,这样会导致一定的性能开销。

       创建方式: 1)、使用NSThread   2)、从NSObject的类方法performSlectorInBackground:withObject:来创建一个线程

2、NSOperation

      基于objective-c实现的,类NSOperation以面向对象的方式封装了用户需要执行的操作,只需要专注自己想要做的事情,不必太操心线程的管理、同步等事情。NSOperation是一个抽象类,必须使用它的子类。IOS提供了两种默认实现:NSInvocationOperation和NSBlockOperation。


3、GCD

       提供一些新的特性,以及运行库来支持多核并行编程,关注点如何在多个CPU上提升效率


线程创建和启动

        NSThread的创建主要有两种直接方式:

        [NSThread detachNewThreadSelector:@selector(myThreadMainMethod:) toTarget:self withObject:nil]和

        NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadMainMethod:) object:nil]

        [thread start]

       两种方式区别:前一种一调用就会立即创建一个线程来执行;而后一种需要手动调用start启动线程才会真正去创建线程。后一种可以在启动线程之前,对线程进行配置,比如          设置stack大小,线程优先级。

       另外一种方式NSObject的类方法perforSelectorInBackground:withObject:来创建,效果与detachNewThreadSelector:toTarget:withObject一样的


线程同步

        线程同步方法与其他系统类似,可以用原子操作,可以用mutex, lock等

        IOS的原子操作韩式以OSAtomic开头,如OSAtomicAdd32, OSAtomicOr32等等。这些函数可以直接使用,因为它们是原子操作。

        IOS中的mutex对应的是NSLock,遵循NSLocking协议,可以使用lock, trylock, lockBeforeData来加锁,用unLock来解锁。

       可以使用指令@synchronized来简化NSLock的使用,不必显示创建NSLock,加锁并解锁。

        - (void)myMethod:(id)obj

        {

@sychronized(obj){

// do something

}

}

用NSCodition同步执行的顺序

        NSCodition是一种特殊类型的锁,可以用来同步操作执行的顺序,与mutex的区别在于更加精准,等待某个NSCodition的线程一直被lock,直到其他线程给那个condition发送         个信号。


线程间通信

         线程在运行过程中,可能需要与其它线程进行通信。可以使用NSObject中的一些方法:

         在应用程序主线程中做事情:

         performSelectorOnMainThread:withObject:waitUntilDone:

         performSelectorOnMainThread:withObject:waitUntilDone:modes:

      在指定线程中做事情:

      performSelector:onThread:withObject:waitUntilDone:
      performSelector:onThread:withObject:waitUntilDone:modes:

      在当前线程中做事情:

      performSelector:withObject:afterDelay:
      performSelector:withObject:afterDelay:inModes:

      取消发送给当前线程的某个消息

     cancelPreviousPerformRequestsWithTarget:
     cancelPreviousPerformRequestsWithTarget:selector:object:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值