iOS多线程

IOS多线程分析 IOS多线程分析
柳行刚

IOS支持的三种线程范式 支持的三种线程范式
1, Thread;

2, Cocoa operations;

3, Grand Central Dispatch (GCD) (iOS4 才开始支持) )

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

三种形式的IOS 三种形式的
1、Cocoa threads: 使用NSThread 或直接从 NSObject 的类方

2、performSelectorInBackground:withObject: 来创建 一个线程。

3、POSIX threads: 基于 C 语言的一个多线程库 如果你选择thread来实现多线程,那么 NSThread 就是官 方推荐优先选用的方式。


Cocoa operations
Cocoa operations是基于 Obective-C实现的,类 NSOperation 以面向对象的方式封装了用户需要执行的 操作,我们只要聚焦于我们需要做的事情,而不必太操心 线程的管理,同步等事情,因为NSOperation已经为我 们封装了这些事情。 NSOperation 是一个抽象基类,我 们必须使用它的子类。

iOS 提供了两种默认实现: NSInvocationOperation 和 NSBlockOperation。

Grand Central Dispatch (GCD):
Grand Central Dispatch (GCD): iOS4 才开始支持, 它提供了一些新的特性,以及运行库来支持多核并行编程, 它的关注点更高:如何在多个 cpu 上提升效率。

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

 [NSTredad etachNewThreadSelector:@selector(myThreadMai nMethod :)toTarget:self withObject:nil];

 和 NSThread*my Thread=[[NS Thread alloc] initWith Targets elf selector:@selector(myThreadMainMethod object:nil]; [my Thread start];

NSThread线程创建两种方式的区别 线程创建两种方式的区别
这两种方式的区别是:

前一种一调用就会立即创建一 个线程来做事情;

而后一种虽然你 alloc 了也 init了,但 是要直到我们手动调用 start 启动线程时才会真正去创建 线程。这种延迟实现思想在很多跟资源相关的地方都有用 到。后一种方式我们还可以在启动线程之前,对线程进行 配置,比如设置 stack 大小,线程优先级。

NSThread线程创建的一种间接方式 线程创建的一种间接方式
还有一种间接的方式,更加方便,我们甚至不需要显式 编写NSThread相关代码。那就是利用NSObject的类方法 performSelectorInBackground:with Object:来创建一个 线程 [myObj performSelectorInBackground:@selector(my ThreadMainMethod)withObject:nil]; 其效果与 NSThread的 detachNewThreadSelector:toTarget withObject:是一样的。

线程同步
线程的同步方法跟其他系统下类似,我们可以用原子操作 ,可以用mutex,lock等。iOS的

原子操作函数是以 OSAtomic 开头的,比如:OSAtomicAdd32, OSAtomicOr32等等。 这 些函数可以直接使用,因为它们是原子操作。iOS中的 mutex 对就的是NSLock,它遵循NSLooking协议,我们可以使用lo ck,tryLock,lockBeforeData:来加锁,用unLock来解锁。

线程同步示例
BOOL moreToDo = YES;

NSLock *theLock = [[NSLock alloc] init];

 ... while (moreToDo)

 {

/* Do another increment of calculation */

/* until there’s no more to do. */

if ([theLock tryLock])

   {

        /* Update display used by all threads. */

       [theLock unlock];

  }

}

线程同步简化方法
我们可以使用指令@synchronized 来简化 NSLock的使 用 ,这样我们就不必显示编写创建NSLock,加锁并解锁相关代 码。

 - (void)myMethod:(id)anObj

 {

     @synchronized(anObj)

     {

           // Everything between the braces is protected by the @synchronized directive.

     }

}

用NSCodition同步执行的顺序 同步执行的顺序
NSCodition 是一种特殊类型的锁,我们可以用它来同步 操作执行的顺序,它与 mutex 的区别在于更加精准,等待 某 个NSCondtion的线一直 lock,直到其他线程给那个 conditioncondition 发送了信号。下面我们来看使用示例: 某个线程等待着事情去做,而有没有事情做是由其他线程通 知它的。

用NSCodition同步执行的顺序二 同步执行的顺序二
[cocoaCondition lock];

while (timeToDoWork <= 0)

 [cocoaCondition wait];

 timeToDoWork--;

 // Do real work here.

 [cocoaCondition unlock];

 其他线程发送信号通知上面的线程可以做事情了:

 [cocoaCondition lock];

timeToDoWork++;

[cocoaCondition signal];

[cocoaCondition unlock];

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

1、在应用程序主线程中做事情: performSelectorOnMainThread:withObject:waitUntilDone: performSelectorOnMainThread:withObject:waitUntilDone:modes:

2、在指定线程中做事情: performSelector:onThread:withObject:waitUntilDone: performSelector:onThread:withObject:waitUntilDone:modes:

3、在当前线程中做事情: performSelector:withObject:afterDelay: performSelector:withObject:afterDelay:inModes:

4、取消发送给当前线程的某个消息 cancelPreviousPerformRequestsWithTarget: cancelPreviousPerformRequestsWithTarget:selector:object:

如在我们在某个线程中下载数据,下载完成之后要通知主线程中更新 界面等等,可以使用如下接口:

- (void)myThreadMainMethod

{

 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

// to do something in your thread job ...

 [self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];

 [pool release];

 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值