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: