思维导图地址:https://pan.wps.cn/l/shFszm5WVHDh?f=130
一、线程进程的基本概念
1、进程
可以理解成一个运行中的应用程序,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,主要管理资源。
2、线程:
(1)操作系统能够进行运算调度的最小单位,一个进程对应多个线程。
(2)线程被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
(3)线程是独立调度和分派的基本单位。同一进程中的多条线程将共享该进程中的全部系统资源,但是自有调用堆栈和寄存器环境。
3、主线程:
(1)处理UI,所有更新UI的操作都必须在主线程上执行。
(2)用于创建其他的子线程,
(3)不要把耗时操作放在主线程,会卡界面。
(4)通常它必须在最后完成执行(比如各种关闭操作)。
4、多线程:
在同一时刻,一个CPU只能处理1条线程,但CPU可以在多条线程之间快速的切换,只要切换的足够快,就造成了多线程一同执行的假象。
5、线程进程形象举例
线程就像火车的一节车厢,进程则是火车。车厢(线程)离开火车(进程)是无法跑动的,而火车(进程)至少有一节车厢(主线程)。多线程可以看做多个车厢,它的出现是为了提高效率。
6、队列:
队列指执行任务的等待队列,即用来存放任务的队列,它是一种特殊的线性表,采用 FIFO(先进先出)的原则,即新任务总是被插入到队列的末尾,而读取任务的时候总是从队列的头部开始读取。
(1)串行队列:多个任务顺序执行
(2)并行队列:多个任务同时执行(根据最大线程数最多同时执行几个任务)
7、任务:
任务(task)用于指代抽象的概念,表示需要执行工作,具体可以是一个函数或者一个block。
8、目的和意义:
多线程是通过提高资源使用率来提高系统总体的效率,将耗时的操作放在后台执行!。
二、线程的状态与生命周期
image.jpeg下面分别阐述线程生命周期中的每一步
1、新建:
实例化线程对象
2、就绪:
向线程对象发送start消息,线程对象被加入可调度线程池等待CPU调度。
3、运行:
CPU 负责调度可调度线程池中线程的执行。线程执行完成之前,状态可能会在就绪和运行之间来回切换。就绪和运行之间的状态变化由CPU负责,程序员不能干预。
4、阻塞:
当满足某个预定条件时,可以使用休眠或锁,阻塞线程执行。sleepForTimeInterval(休眠指定时长),sleepUntilDate(休眠到指定日期),@synchronized(self):(互斥锁)。
5、死亡:
正常死亡,线程执行完毕。非正常死亡,当满足某个条件后,在线程内部中止执行/在主线程中止线程对象
6、[NSThread exit] 强行终止:
一旦强行终止线程,后续的所有代码都不会被执行。
7、[thread cancel] 取消:
并不会直接取消线程,只是给线程对象添加 isCancelled 标记。
三、多线程的四种解决方案:pthread,NSThread,GCD,NSOperation
下图是对这四种方案进行了解读和对比。
方案 | 简介 | 底层语言 | 线程生命周期 | 优点 | 缺点 |
---|---|---|---|---|---|
pthread | 1、一套通用的多线程api 2、适用于Unix/Linux/Windows等系统 3、跨平台\可移植 4、使用难度大 |
C语言 | 程序员管理 | ||
NSThread | 1、使用更加面向对象 2、简单易懂,可直接操作线程对象 |
OC | 程序员管理 | 轻量级最低,相对简单 | 需要手动管理所有的线程活动(生命周期,休眠,同步等)线程同步对数据的加锁会有一定的系统开销 |
Cocoa NSOperation | 1、基于GCD(底层是GCD) 2、比GCD多了一些简单实用的功能 3、使用更加面向对象 |
C语言 | 程序员管理 | 自带线程周期管理,可只关注自己处理逻辑 | NSOperation是面向对象的抽象类,实现只能是其子类(NSInvocationOperation和NSBlockOperation),对象需要添加到NSOperationQueue队列里执行 |
GCD | 1、旨在替换NSThread等线程技术 2、充分利用设备的多核 |
C语言 | 程序员管理 | 效率高,可避免并发陷阱 | 基于C而非OC实现 |
如果对性能效率要求较高,处理大量并发时用GCD,简单而安全的可用NSOPeration或者NSThread。Apple推荐使用GCD
网友评论