多线程简介
作用
多线程可以解决耗时操作(网络操作)卡顿UI的问题,将耗时操作放在后 台,待工作完成后,通知主线程更新UI
一个线程的数据可以直接提供给其他线程使用,叫做线程间通信
线程生命周期的控制
分类
任务(代码)执行的俩种方式 同步:多个任务按顺序执行 异步:多个任务可以"同时"执行,异步就是多线程的代名词,使用多线程 技术就是为了让任务在子线程异步执行
内容
进程和线程 系统中,正在运行的程序,进程中的任务都是线程中执行的,线程是 进程最基本的执行单元,进程启动后,会默认开启一条线程,即是主线程
多线程
一个进程可以开启多个线程,同时异步执行不同的任务 执行原理:CPU在多个线程之间来回的切换调度线程执行 优缺点:可以"适当"提高程序执行的效率,还可以提升用户体验,但是当 线程非常多时,反而会大量的消耗CPU的资源 使用规则:在实际开发中,需要使用时尽量简单的使用,如果不需要使用, 绝对不要瞎用
注意
主线程/UI线程
是进程启动后,自动开启的,专门处理UI事件和刷新UI的,不要在主线程执 行耗时操作,会卡死UI
__bridge(桥接)
当遇到C和OC混合开发时,需要用到桥接,在ARC环境下,编辑器不负责C
语言申请的内存,当涉及到OC和C语言的类型转换时,需要使用桥接告知
编辑器如何管理内存,在MRC环境下不需要
线程属性
主线程在IOS 8以后是512K,子线程就是512K
线程安全
共享资源:全局的变量/对象/沙盒文件,能够被共享出来的数据
多线程的资源抢夺:多个线程在同一时间访问共享资源,会造成线程安全问题,数据的错乱
解决办法:
1.互斥锁:可以保证被锁定的代码,同一时间有且仅有一个线程可以访问
2.自旋锁:在原子属性(atomic
)的setter方法内部自带,原子属性特点:单写多读
Tips
:UIKit/NSMUtable 都是线程不安全的,苹果为了流畅的用户体验,所有由于UIKit是线程不安全的,所以刷新UI需要专门制定主线程来完成
线程的退出和取消
exit:
* 使当前线程退出
* 不能再主线程中调用这个方法,会使主线程退出
* 当前线程死亡之后,这个线程中剩下的所有代码都不会执行
* 在调用此方法之前一定要注意释放之前由C语言框架创建的对象
* 调用exit方法属于在线程内部取消线程,有时候需要在线程外部,当某一条件满足时取消线程
cancel:
* 这个方法只是修改了线程的状态而已,并没有真正的取消线程
* 如果想真正的取消线程需要在线程执行的过程中判断线程的状态是够是已取消
* 如果该线程已经被取消,就直接返回,不再执行后面的代码
线程常用属性
name
线程名称可以当线程执行的方法内部出现异常时,记录异常和当前线程
stacSize
默认情况下,无论是主线程还是子线程,栈区都是512K 栈区大小可以设置[NSThread currentThread].stackSize = 1024 * 1024; 必须是4KB的倍数
isMainThread
是否主线程
threadPriority - 线程优先级
优先级,是一个浮点数,取值范围 0~1.0 1.0 表示优先级最高,默认是0.5
Tips
:优先级只能保证CPU调度的可能性会高
qualityOfService - 服务质量(iOS 8.0 推出)
与线程优先级作用相似
来源:https://www.cnblogs.com/jialiangliang/p/6515233.html