iOS多线程技术

来源:互联网 发布:淘宝新店有流量扶持吗 编辑:程序博客网 时间:2024/04/30 11:40


进程和线程的概念:

一个运行的程序就是一个进程或者叫做一个任务 

一个进程至少包含一个线程,线程是程序的执行流 
iOS程序启动时,在创建一个进程的同时, 会开始运行一个线程,该线程被称为
主线程 
主线程是其他线程最终的父线程,所有界面的显示操作必须在主线程进行! 
后台线程无法更新UI界面和响应用户点击事件 
 系统中的每一个进程都有自己独立的虚拟内存空间,而同一个进程中的多个线程
则共用进程的内存空间 
每创建一个新的线程,都会消耗一定内存和CPU时间 

当多个线程对同一个资源出现争夺的时候需要注意线程安全问题 

多线程的优势与难点 
优势: 1、充分发挥多核处理器优势,将不同线程任务分配给不同的处理器,
真正进入“并行运算”状态
             2、将耗时、轮询或者并发需求高等任务分配到其他线程执行,并由主
线程负责统一更新界面会使得应用程序更加流畅,用户体验更好
     3、当硬件处理器的数量增加,程序会运行更快,而无需做任何调整

难点:1、共享资源的“争夺”
   2、多线程是为了同步完成多项任务,不是为了提高运行效率,而是为
了通过提高资源使用效率来提高系统的整体性能


多线程使用注意事项 :
1、线程使用不是无节制的
2、 iOS中的主线程的堆栈大小是1M
3、从第二个线程开始都是512KB
4、这些数值不能通过编译器开关或线程API函数更改
5、只有主线程有直接修改UI的能力

iOS的三种多线程技术 :
1. NSThread 每个NSThread对象对应一个线程,量级较轻
2.NSOperation/NSOperationQueue 面向对象的线程技术
3. GCD —— Grand Central Dispatch 是基于C语言的框架,可以充分
利用多核,是苹果推荐使用的多线程技术


以上这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的
使用越简单,也是Apple最推荐使用的。但是就目前而言,iOS的开发者,
需要了解三种多线程技术的基本使用过程。因为很多框架技术分别使用了
不同多线程技术。

三种多线程技术的对比 
1、 NSThread: 
优点:NSThread 比其他两个轻量级,使用简单 ;
         缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤
醒等。线程同步对数据的加锁会有一定的系统开销 。
2、NSOperation: 
优点:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执
行的操作上;NSOperation是面向对象的 
3、 GCD: 
  Grand Central Dispatch是由苹果开发的一个多核编程的解决方案。
iOS4.0+才能使用,是替代NSThread, NSOperation的高效和强大
的技术 ; GCD是基于C语言的 

NSObject的多线程方法——后台线程 
- (void)performSelectorInBackground:(SEL)aSelector 
withObject:(id)arg
 通常,由于线程管理相对比较繁琐,而很多耗时的任务又无法知道其准确的完成时间,因此可以使用performSelectorInBackground方法直接新建一个后台线程,并将选择器指定的任务在后台线

程执行,而无需关心具体的NSThread对象;
提示: performSelectorInBackground 方法本身是在主线程中执行的,而选择器指定的方法是在

后台线程中进行的;
使用 performSelectorInBackground 方法调用的任务可以更新UI界面;

在大型交互式游戏中,通常使用此方法在后台线程播放音效。


NSObject的多线程方法——主线程 
- (void)performSelectorOnMainThread:(SEL)aSelector 
withObject:(id)arg waitUntilDone:(BOOL)wait;
如果要更新UI界面,可以在后台线程中调用
performSelectorOnMainThread方法
提示:尽管使用 performSelectorInBackground 方法调用的任务
可以更新UI界面,但是在实际开发中,涉及到UI界面的更新操作,还是
要使用performSelectorOnMainThread方法,以避免不必要的麻烦

NSObject的多线程小结 :


 开启后台执行任务的方法: 
- (void)performSelectorInBackground:(SEL)aSelector 
withObject:(id)arg 


 在后台线程中通知主线程执行任务的方法 :

- (void)performSelectorOnMainThread:(SEL)aSelector 
withObject:(id)arg waitUntilDone:(BOOL)wait; 


 获取线程信息 
[NSThread currentThread]; 


 线程休眠(仅适用于开发调试时使用) 
[NSThread sleepForTimeInterval:1.0f]; 


 特点: 使用简单,量级轻 ;不能控制线程的执行顺序

NSOperation & NSOperationQueue 
 NSOperation的两个子类 
1. NSInvocationOperation 
2. NSBlockOperation 
工作原理: 
1. NSOperation封装要执行的操作 
2.将创建好的NSOperation对象放NSOperationQueue中 
3.启动OperationQueue开始新的线程执行队列中的操作 
注意事项: 
1.使用多线程时通常需要控制线程的并发数,因为线程会消耗系统资源,同
时运行的线程过多,系统会变慢 
2.使用以下方法可以控制并发的线程数量: 
-  (void)setMaxConcurrentOperationCount:(NSInteger)cnt;


GCD:是基于C语言的框架: 

工作原理: 
1、让程序平行排队的特定任务,根据可用的处理资源,安排它们
在任何可用的处理器上执行任务 
2、要执行的任务可以是一个函数或者一个block 
3、底层是通过线程实现的,不过程序员可以不必关注实现的细节 
 GCD中的FIFO队列称为dispatch queue,可以保证先进来的任务先得到执行 
4、 dispatch_notify 可以实现监听一组任务是否完成,完成
后得到通知 
 GCD队列: 
1.全局队列:所有添加到主队列中的任务都是并发执行的 
2.串行队列:所有添加到串行队列中的任务都是顺序执行的 
3.主队列:所有添加到主队列中的任务都是在主线程中执行的

获取队列的方法 
全局队列(可能会开启多条线程) 
dispatch_queue_t queue = 
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
串行队列(只可能会开启一条线程)
dispatch_queue_t queue = dispatch_queue_create("myQueue", 
DISPATCH_QUEUE_SERIAL);
主队列
dispatch_get_main_queue();


GCD任务的执行方式——同步&异步 
异步操作
 1、dispatch_async 在其他线程执行任务,会开启新的线程;
 2、异步方法无法确定任务的执行顺序;
同步操作: 
1、dispatch_sync 在当前在当前线程执行任务,不开启新的线程
2、同步操作与队列无关
3、同步方法会依次执行,能够决定任务的执行顺序
4、更新界面UI时,最好使用同步方法


0 0
原创粉丝点击