前言
由于一条线程同时只能处理一条任务,所以一个线程里面的任务只能顺序执行。如果遇到耗时的操作,需要等待上一个任务完成之后再执行下一个任务。这是很不好的用户体验。在iOS中,通过将耗时的操作放到一个子线程里面,而把用户交互的操作放到主线程里面,保证应用及时响应用户的操作,提供用户的体验。这就是多线程技术。
多线程是指从软件或者是硬件上实现多个线程并发执行的技术
进程
先要学好多线程,我们必须首先了解什么是进程、什么是线程,以及他们之间的区别是什么!
进程是指程序正在运行的独立单元,也可以理解为一个正在运行的程序就是一个进程。每个进程拥有自己独立的地址空间。进程作为系统进行分配和调度的一个独立的单位,主要有一下几个特征:
- 独立性:进程是一个独立运行的基本单位,它拥有自己独立的资源,又拥有自己私有的地址空间。在没有经过进程允许的情况下,一个进程不可以访问其他进程的地址空间。
- 动态性:进程的实质是程序在系统中的一次执行过程,程序只是一个静态的指令集合,而进程是一个正在系统中活动的指令集合。进程有时间的概念,他拥有自己的生命周期和不同的活动状态,是动态消亡的。
- 并发性: 多个进程可以在处理器中同时执行。不会互相影响(同时执行并非真正意义上的并发执行,它只是CPU在多个进程之间来回切换,造成程序同时执行的假象)。
线程
线程是进程的基本执行单位,一个进程必定有一个主线程(进程就像是操场,线程就像是操场上一条条的跑道)。
由于创建一个进程的时候,系统必须为进程分配独立的内存空间,并且需要分配大量的相关资源。但是创建一个线程就简单许多。所以使用多线程实现并发比多进程性能要高很多。多线程编程主要有一下几大优势:
- 进程间不能共享内存,但是线程之间内存共享很容易
- 当硬件处理器的数量有所增加时,程序运行的速度更快
- 可以充分发挥多核处理器的优势,将不同的任务分配给不同的处理器,真正进入并行时代。
- 耗时之类的操作放到子线程,主线程负责用户交互。提高用户体验。
多线程开发的劣势
虽然多线程开发能提高程序的运行效率,提供用户体验。让一个程序更加的健壮。但是凡事有利有弊,多线程开发也需要注意下面几个问题:
- 开启线程需要占用一定的内存空间(默认情况下,主线程最大占用1M的栈区空间,子线程最大占用512K的栈区空间),所以线程开启过多,内存消耗过大,从而会降低程序的性能。
- 开启的线程越多,CPU在调度线程上的开销就会越大,一般最好不用同时开启5个线程
- 程序的设计会变得更加复杂,如线程之间的通信,多线程之间的数据共享等
线程的并行和串行
如果一个进程中只有一个线程,而这个进程要执行多个任务,那么这些任务只能一个一个按顺序的执行。也就是说,在同一个时间内,只能执行一个任务,这样的线程执行方式成为串行。
如果一个进程包含不只一个线程,每条线程之间可以并行执行不同的任务,则称之为线程的并行。
多线程的实现方式
iOS一共有四种多线程的实现方式,它们各有侧重,具体区分如下:
多线程实现方式 | 简介 | 语言 | 线程生命周期 | 使用频率 |
---|---|---|---|---|
pthread | 一套通用的多线程API,跨平台可移植,使用难度大 | C | 程序员管理 | 几乎不用 |
NSThread | 使用更加面向对象,可以直接操作线程对象 | OC | 程序员管理 | 偶尔使用 |
GCD | 旨在替代NSThread技术,使用简单,充分利用设备的多核优势 | C | 自动管理 | 经常使用 |
NSOperation | 基于GCD,比GCD多了一些更加简单实用的功能,实用更加面向对象 | OC | 自动管理 | 经常使用 |
网友评论