提到多线程的时候,必不可少的会提到进程相关的概念,这里先简单总结一下进程和线程。
什么是进程?什么是线程?
进程是指系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在专用的且受保护的内存。
iOS系统是单进程,Android支持多进程。
线程是进程的基本单元,一个进程的所有任务都要在线程中执行,进程要想执行任务必须要有线程,也就是,进程至少要有一条线程。
程序启动会默认开启一条线程,这条线程被称为主线程或者UI线程。
进程和线程的区别
地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
资源拥有:同一进程内的线程共享本进程的资源,如内存、I/O、CPU等,但是进程之间的资源是独立的。
执行过程:每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口,但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
崩溃影响:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉,所以多进程要比多线程健壮。
线程是处理器调度的基本单位,但是进程不是。
多线程的意义
优点:
- 能适当提高程序的执行效率;
- 能适当提高资源的利用率(CPU、内存);
- 线程上的任务执行完后,线程会自动销毁;
缺点:
- 开启线程需要占用一定的内存空间(默认情况下,每一个线程都占512KB);
- 如果开启大量的线程,会占用大量的内存空间,降低程序性能;
- 线程越多,CPU在调用线程上的开销越大;
- 程序设计更加复杂,比如线程之间的通信,多线程的数据共享;
多线程原理
CPU在单位时间片里快速在各个线程之间切换。这个可能和我们常规所想的不一致。实际上就是CPU在线程间的快速切换,造成了多线程同时执行任务的假象。
线程的生命周期
新建:新建状态,未启动;
就绪:线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源;
运行:线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。
堵塞:调用sleep方法、等待同步锁、从可调度线程池移除等情况导致堵塞;
死亡:完成任务自动销毁,异常终止,强制退出。
线程和队列的关系
线程和队列没有什么必然的关系。可以这样理解队列是用来存任务的,就是一种数据结构。队列分为串行队列和并行队列。串行队列遵循FIFO(先进先出)原则。
线程是用来执行任务的,具体的执行需要用函数来操控。执行方式分为同步执行和异步执行。同步执行:不会开启子线程在当前线程执行任务,必须等待当前语句执行完毕才会执行下一条语句。异步执行:异步又是多线程的代名词,会开启子线程,不用等当前语句执行完毕,就可以执行下一条语句。
同步、异步与串行、并行,形成四种组合:
同步+串行
- 不会开启其他线程,在当前线程执行任务;
- 任务串行执行,任务一个接一个;
-
同步+并行
不会开启其他线程,在当前线程执行任务;
-
异步+串行
开启一条新线程;
-
异步+并行
开启多个新线程;
- 任务执行没有顺序,和CPU调度有关;
线程池
线程的创建、销毁会造成系统资源的消耗,线程池就是将已经创建的线程添加到池子中,通过重用应创建的线程,降低了这种消耗。
| 参数名 | 代表含义 |
|---|---|
| corePoolSize | 线程池的基本大小(核心线程池大小) |
| maximumPoolSize | 线程池的最大大小 |
| keepAliveTime | 线程池中超过corePoolSize数目的空闲线程的最大存活时间 |
| unit | keepAliveTime参数的时间单位 |
| workQueue | 任务阻塞队列 |
| threadFactory | 新建线程的工厂 |
| handler | 当提交的任务超过maximumPoolSize与workQueue之和时,任务会交给RejectedExecutionHandler来处理 |
线程池的原理图
多线程技术方案
| 方案 | 简介 | 语言 | 线程生命周期管理 | 使用频率 |
|---|---|---|---|---|
| pthread | - 一套通用的多线程API - 适用于Unix/Linux/Windows等系统 - 跨平台/可移植 - 使用难度大 |
C | 程序员管理 | 几乎不用 |
| NSThread | - 使用更加面相对象 - 简单易用,可直接操作线程对象 |
OC | 程序员管理 | 偶尔使用 |
| GCD | - 旨在替代NSThread等线程技术 - 充分利用设备的多核 |
C | 自动管理 | 经常使用 |
| NSOperation | - 基于GCD(底层是GCD) - 比GCD多了一些更简单实用的功能 - 使用更加面向对象 |
OC | 自动管理 | 经常使用 |
