首先,介绍下,进程与线程。
进程,在iOS中,一个App就是一个进程,每个进程都有独立的内存区域和数据。沙盒就是那个独立的存储数据的地方。
而线程,一个进程中有一个主线程,还可以开辟几个子线程,分别进行并行的不同操作。一个进程中的多线程可以共享进程中的内存和数据。线程提高了并发性,大大增强了程序的运行效率。
在iOS中多线程机制也运用很多。
首先多线程的实现方式有以下几种:
1. NSThread: NSThread 是最为轻量级的多线程方式,但是需要开发者手动管理Thread 的生命周期,线程同步,加锁等工作。现在用NSThread的很少。
performSelectorInBackground: 调用此方法时,也相当于是使用NSThread的多线程。
2. NSOperation: 不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上去。NSOperationQueue类是一个线程队列管理类,它提供了线程并行,线程管理的处理。一旦将操作添加到操作队列,操作就会启动。操作队列可以控制任务的先后依赖关系,并发线程数量,启动线程,取消线程,根据优先级调度线程等等。
3.GCD(Grand Central Dispatch): 分为线性执行队列[Serial Dispatch Queue]和并发执行队列[Concurrent Dispatch Queue]。
系统的Dispatch Queue: 主线程队列(main dispatch queue),全局并行队列(global dispatch queue)。一般不必创建新的dispatch queue,使用global dispatch queue即可。 global dispatch queue,可同步,可异步。而main dispatch queue,则只能同步。执行任务的顺序一般都是根据任务的添加顺序。一旦任务添加到queue中,便不好取消操作。
多线程的访问安全问题:
在多线程中,比较复杂的就是数据访问安全问题。
解决数据访问安全问题的方法有,加锁,原子性操作等。
互斥锁使用了线程同步的原理,互斥锁的优缺点:
优点:能够有效防止因多线程争夺数据而导致的数据安全问题。
缺点:需要消耗大量的资源。
属性:原子属性 atomic, 非原子属性 nonatomic.
atomic: 在setter方法中添加互斥锁, 线程安全,但需要消耗大量的CPU资源,默认为atomic。
nonatomic: 在setter方法中没有互斥锁,非线程安全。
http://www.cnblogs.com/wendingding/p/3805841.html
RunLoop: 顾名思义,事件循环。一个RunLoop就是一个事件处理的循环,用来调度工作和不断接收输入源。
使用RunLoop的目的就是在于让线程有工作的时候忙于工作,没有工作的时候处于休眠状态。
RunLoop 的管理并不完全是自动的。必须设计线程代码以在适当的时候启动runloop 并正确响应输入事件。每个线程都有与之对应的Runloop对象。不需自己创建,只需手动启动。
要用while或for语句来处理不断接收的事件。