(一)、线程和进程的概念
进程和线程实际都是一个时间段的描述,是CPU工作时段的描述。
进程时间段 = CPU加载程序上下文的时间 + CPU执行时间 + CPU保存程序上下文的时间
(可以简单理解为进程为一个应用程序,但一个应用程序可能创建多个进程,这时候一个进程的结束不代表应用程序运行结束)
线程时间段 = CPU加载线程上下文的时间 + CPU执行时间 + CPU保存线程上下文的时间
(是CPU调度和分派的基本单位,是更为细小的时间段,远小于进程时间段)
(二)、线程的状态与生命周期
下图是线程状态示意图,从图中可以看出线程的生命周期是:新建 - 就绪 - 运行 - 阻塞 - 死亡
线程的状态与生命周期.png
(三)、多线程的四种解决方案
多线程的四种解决方案分别是:pthread,NSThread,GCD, NSOperation。
下图是对这四种方案进行了解读和对比。
多线程的四种解决方案.png
(四)、GCD和NSOperation的理解与使用
术语解释.png(1)、GCD的特点
2050812-4331a4ac4cebd9d8.pngGCD以block为基本单位,一个block中的代码可以为一个任务。GCD以block为基本单位,一个block中的代码可以为一个任务。下文中提到任务,可以理解为执行某个block
同时,GCD中有两大最重要的概念,分别是“队列”和“执行方式”。
使用block的过程,概括来说就是把block放进合适的队列,并选择合适的执行方式去执行block的过程。
- GCD会自动利用更多的CPU内核
- GCD自动管理线程的生命周期(创建线程,调度任务,销毁线程等)
- 程序员只需要告诉 GCD 想要如何执行什么任务,不需要编写任何线程管理代码
(2)、NSOperation简介
-
NSOperation是基于GCD之上的更高一层封装,NSOperation需要配合NSOperationQueue来实现多线程。
NSOperation实现多线程的步骤如下
(1)、 创建任务:先将需要执行的操作封装到NSOperation对象中。
(2)、 创建队列:创建NSOperationQueue。
(3)、 将任务加入到队列中:将NSOperation对象添加到NSOperationQueue中。 -
需要注意的是,NSOperation是个抽象类,实际运用时中需要使用它的子类,有三种方式:
(1)、使用子类NSInvocationOperation
(2)、使用子类NSBlockOperation
(3)、定义继承自NSOperation的子类,通过实现内部相应的方法来封装任务。
NSOperation 和GCD 到底选哪一个?
- 从性能上来说:
GCD是底层的C语言构成的API,更接近底层,而NSOperationQueue基于GCD,使用Objective-C实现的面向对象的线程管理,比GCD更高级抽象。所以GCD在追求性能的底层操作来说,是速度最快的。(单纯从性能速度来说,只有Instruments显示有真正的性能提升时才有必要用低级的GCD。) - 对同一个并行队列中的任务操作来说:
在NSOperationQueue中,可以随时取消已经设定要准备执行的任务,能够方便地设置依赖关系,能够设置NSOperation的priority优先级,而GCD需要自己写更多的代码来实现。 - 从复用度来说:
能够对NSOperation进行继承,在这之上添加成员变量与成员方法,提高整个代码的复用度,这比简单地将block任务排入执行队列更有自由度,能够在其之上添加更多自定制的功能。
- NSOperation在线程并发管理、优先级上有着GCD无法比拟的优势。
- 但是当需求能够以更简单的底层代码完成的时候,GCD或许是个更好的选择,因为GCD主要与block结合使用,代码简洁高效和集中,维护度比较高。
网友评论