进程
- 一个正在运行的程序就是一个进程 注意这里是
正在运行的
- 可以同终端 输入top命令查看电脑的进程
-
输入命令q就直接退出
-
线程跟进程的联系
如果我们想打开QQ音乐听歌,那么首先由打开QQApp,这时候创建一个进程在内存中,当然这样播放音乐的任务是不能够被执行的,这时候就需要创建线程去执行任务,也就是说任务是在线程中执行的,一个进程可以开启多条线程去执行任务
线程的串行
-一条线程
执行任务的方式是串行
的 换句话说 一个进程想要执行多个任务,就只能按顺序
执行多个任务,在同一个时间
只能执行一个
任务
进程和线程的比较
- 线程CPU调用(执行任务的最小单位)最小单位
- 进程是CPU分配资源的最小单位 也就是说所有线程共享CPU分配给进程 的资源
- 一个程序可以对应多个进程
例如我们电脑装了一个QQ 但是我们可以command + N同时打开好几个QQ, 每一个运行的QQ都是一个进程
- 一个进程可以拥有多个线程,但至少要有一个线程
多线程
概念
- 一个进程可以开启多条线程,多条线程并行(同时)执行不同的任务
多线程原理
- 其实同一时间内CPU只能处理一条线程, 也就是说同一时间不管开启多少条线程,CPU只会执行一条,多线程并发就是CPU在多条线程之间快速的调度.造成多条线程并发执行的假象
(这里指的是单核CPU),如果是多核就是真正多线程并发执行了
注意:在实际开发中一般开3~5条,并不是越多越好
多线程在iOS开发中的应用
主线程
一个iOS程序执行,默认会开启一条线程,称之为
主线程
或UI线程
- 作用
- 显示\刷新UI界面
- 处理一个UI时间(点击事件、滚动事件、拖拽事件等)
- 注意
- 耗时的操作放在子线程(后台线程)中执行 如果放在主线程会造成UI界面卡顿现象
iOS中多线程的实现方案
Thread
// 第一种方式
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(thread1) object:nil];
// 优先级代码CPU执行的机会多一些
thread.threadPriority = 0.1;
thread.name = @"name";
// 线程执行
[thread start];
// 第二种方式
/**
* // 分离出一条线程 不需要手动执行 没有返回值
*
* @param SEL withObject 可以传值
*
* @return <#return value description#>
*/
[NSThread detachNewThreadSelector:<#(nonnull SEL)#> toTarget:<#(nonnull id)#> withObject:<#(nullable id)#>];
// 第三种方式
// 开启一条后台线程 NSObject (NSThreadPerformAdditions)分类方法
[self performSelectorInBackground:<#(nonnull SEL)#> withObject:<#(nullable id)#>];
线程的生命周期(状态)
注意:线程死亡了是不可以在调用start方法运行的
- 多线程隐患
注意:
- 能不能加锁就不加锁 加锁需要性能开销的
- 注意加锁的位置
线程同步
- 加锁之后 多个线程会按着固定顺序执行 ,专业术语叫做
线程同步
/**
* toke 锁对象 必须唯一 对象 字符床也可以 一般传递self
*/
@synchronized (self) {
// 加锁的代码
}