基础知识:
进程:
在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程都运行在其专用并且受保护的内存空间中
线程:
一个进程要想执行任务,必须得有线程(一个进程至少有一条线程),进程中所有的任务都在线程中执行
二者关系与比较比较:
1.线程是CPU执行任务的最小单位
2.进程是CPU分配资源的最小单位
3.一个进程至少有一条线程
4.进程内的线程共享这个进程的资源
多线程:
一个进程中可以开启多条线程,每条线程可以同时执行不同的任务,可以提高程序的执行效率
原理:
同一时间CPU只能处理一条线程,多线程开发其实就是CPU快速的在多条线程之间切换,如果CPU切换的速度足够快,就造成了多线程同时执行的现象,如果线程非常多,会消耗大量的CPU资源
优点:
适当提高程序的执行效率
适当提高资源利用率(CPU,内存的利用率)
缺点:
创建线程是有开销的
如果开启大量线程,会降低程序性能
线程越多,CPU调度线程上的开销越大
程序设计更复杂(线程通讯,数据共享等)
一些名词的介绍:
同步:会阻塞当前线程,且不会开辟新线程
异步:具备开辟新线程的能力,且不会阻塞当前线程(比如:main队列)
串行:执行完前一个任务之后,再执行后一个任务
并发: 执行前一个任务后,就可以执行下一个任务
多线程在ios开发中的应用
主线程:
一个ios程序运行,默认会开启一条线程,称为主线程或UI线程
作用:
显示,刷新UI界面,处理UI事件
注意事项:
不要将耗时的操作放到主线程中,这样会影响UI的流畅度
线程安全
01 前提:多个线程访问同一块资源会发生数据安全问题
02 解决方案:加互斥锁
03 相关代码:@synchronized(self){}
04 专业术语-线程同步
05 原子和非原子属性(是否对setter方法加锁)
互斥锁: 线程同步技术(多条线程在同一条线上按顺序地执行)
@synchronized(锁对象){需要锁定的代码}
锁定一份代码只能用一把锁,多把锁无效的
优点:能有效防止因多线程抢夺资源造成的数据安全问题
缺点:需要消耗大量的CPU资源
原子属性和非原子属性
atomic:原子属性,为setter方法加锁,线程安全,需要消耗大量资源
nonatomic:非原子属性,不会为setter方法加锁,非线程安全,适合内存小的移动设备
所有属性都声明为nonatomic
尽量避免多线程资源抢夺同一块资源
尽量将加锁,资源抢夺的业务逻辑放到服务端处理,减少移动端压力
线程间通信:多个线程之前需要经常通信
1个线程传递数据给另一个线程
1个线程执行完任务后跳转到另一个线程去执行任务
例如下载图片:子线程中去下载,完成后到主线程中显示
ios中多线程的实现方案
pthread:
一套通用的多线程API,适用于Unix\Linux\Windows等系统,跨平台可移植,使用难度大,C语言实现,程序员管理线程生命周期,几乎不使用
NSThread:
使用更加面向对象,简单易用,可直接操作线程对象,OC语言,程序员管理线程生命周期,偶尔使用
GCD:
替代NSThread等线程技术,充分利用设备的多核,C语言,自动管理线程生命周期,经常使用
NSOperation:
基于GCD封装,比GCD多了一些更简单使用的功能,使用更加面向对象,自动管理线程生命周期,经常使用