进程是指在系统中正在运行的一个应用程序。每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内。
线程
进程要想执行任务,必须得有线程(每1个进程至少要有1条线程),线程是进程的基本执行单元,一个进程的所有任务都在线程中执行。线程中任务的执行是串行的,如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务。也就是说,在同一时间内,1个线程只能执行1个任务。
多线程
即1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务。在同一时间里,CPU只能处理1条线程,只有1条线程在工作。多线程并发执行,其实是CPU快速地在多条线程之间切换,如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象
多线程优缺点
优点
1.能适当提高程序的执行效率。
2.能适当提高资源利用率(CPU、内存利用率)
缺点
1.开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能。
2.线程越多,CPU在调度线程上的开销就越大。
3.程序设计更加复杂:比如线程之间的通信、多线程的数据共享
1 | 5-2 NSThread |
###3 NSThread
(1)NSThread的基本使用
1 | //第一种创建线程的方式:alloc init. |
(2)设置线程的属性
1 | //设置线程的属性 |
(3)线程的状态(了解)
1 | //线程的各种状态:新建-就绪-运行-阻塞-死亡 |
(4)线程安全
01 前提:多个线程访问同一块资源会发生数据安全问题
02 解决方案:加互斥锁
03 相关代码:@synchronized(self){}
04 专业术语-线程同步
05 原子和非原子属性(是否对setter方法加锁)
(5)线程间通信
1 | -(void)touchesBegan:(nonnull NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event |
(6)如何计算代码段的执行时间
1 | //第一种方法 |
###4.GCD
(1)GCD基本知识
01 两个核心概念-队列和任务
02 同步函数和异步函数
(2)GCD基本使用【重点】1
2
3
4
5
6
701 异步函数+并发队列:开启多条线程,并发执行任务
02 异步函数+串行队列:开启一条线程,串行执行任务
03 同步函数+并发队列:不开线程,串行执行任务
04 同步函数+串行队列:不开线程,串行执行任务
05 异步函数+主队列:不开线程,在主线程中串行执行任务
06 同步函数+主队列:不开线程,串行执行任务(注意死锁发生)
07 注意同步函数和异步函数在执行顺序上面的差异
(3)GCD线程间通信
1 | //0.获取一个全局的队列 |
(4)GCD其它常用函数
1 |
|