您的位置:首页 > 移动开发 > IOS开发

iOS多线程编程(一)------ 基本概念

2016-08-23 20:11 295 查看
最近写了一些多线程编程的demo,写了demo,容易忘记,一些概念都写在备忘录了,趁今晚没事,就整理出来,以便以后自己查阅。

一、概述

在开发过程中,最烦的就是等待时间很长,比如开发过程中,编译器突然卡了,什么也操作不了,只能等待,这个时候是最揪心的。又不能强制关了,怕有些数据没有保存。

在用户使用我们的开发的应用的时候,也一样,尽量让用户减少等待时间,尽可能快的完成运算。

二、什么是多线程

每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常有操作系统负责多个线程的调度和执行。(来源百度百科)

一个程序至少有一个进程,一个进程至少有一个线程(主线程)

三、几个的概念的理解

1、串行(Serial) VS 并行 (Concurrent)

串行和并行描述的是任务和任务之间的执行方式。串行是任务A执行完了任务B才能执行,它们俩只能顺序执行,并行则是任务A和任务B可以同时执行。

2、同步(Synchronous) VS 异步(Asynchronous)

同步和异步描述的其实就是函数什么时候返回,比如用来下载图片的函数A:{download image},同步函数只有在image下载结束之后才返回,下载的这段时间函数A只能那边等待…而异步函数,立即返回,图片会去下载,但函数A不会去等它完成。异步函数不会堵塞当前线程去执行下一个函数。

3、并发(Concurrency) VS 并行(Parallelism)

并行和并发都是用来让不同的任务可以“同时执行”,只是并发是伪同时,而并行是真同时,假设你有任务T1和任务T2(这里的任务可以是进程也可以是线程)

a.首页如果你的CPU是单核的,为了实现“同时”执行T1和T2,那只能分时执行,CPU执行一会儿T1后马上再去执行T2,切换的速度非常快(这个的切换也是需要消耗资源的),以至于你以为T1和T2是同时执行了(但其实同一时刻只有一个任务占有着CPU)

b.如果你是多核CPU,那么就可以真正同时执行了T1和T2任务,在同一时刻CPU的核心core执行着T1,然后core2执行着T2。

从github上看的一张图




大体来说:

并发的关键是你有处理多个任务的能力,不一定要同时

并行的关键是你有同时处理多个任务的能力

关键点就是:是否是[同时]

最后打个比方:并发,就像一个人(cpu)喂两个孩子(程序),轮换着每人喂一口,表面上两个孩子都在吃饭。并行,就是2个人喂两个孩子,两个孩子也同时在吃饭。

四、为何使用多线程

每个iOS应用程序都有个专门用来更新显示UI界面、处理用户的触摸事件的主线程,因此不能将其他太耗时的操作(比如下载图片,视频等)放在主线程中执行,不然会操作主线程堵塞(出现卡机现象),带来极坏的用户体验。一般的解决方案就是将耗时的操作(如下载图片,视频等)放到另外一个线程中去执行,多线程编程是防止线程堵塞,增加运行效率的最佳方法。

五、iOS多线程常用方法

1、Thread 是三种方法里面相对轻量级的,但需要管理线程的生命周期,同步、加锁问题,这会导致一定的性能开销

2、Cocoa Operation 是基于OC实现的,NSOperation以面向对象的方式封装了需要执行的操作,不必关心线程管理,同步等问题。NSOperation是一个抽象基类,iOS提供了两种默认实现:NSInvocationOperation和NSBlockOperation,当然也可以自定义NSOperation。

3、Grand Central Dispatch(简称CGD,iOS4才开始支持)提供了一些新特性,运行库来支持多核运行并行编程,它的关注点更高,如果在多个cpu上提示效率。

注:下面几篇文章会详解讲解iOS多线程的常用方法。

如有不对之处还往评论指出,谢谢

参考链接 http://www.cocoachina.com/game/20151201/14517.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息