首页 > 代码库 > MJ - 0915 - 多线程1
MJ - 0915 - 多线程1
MJ代码级别
进程:
》系统正在运行的一个应用程序
》独立的,互不干扰
线程
》每个进程至少有一个线程
》串行,顺序执行
》线程是进程的一条执行路径
多线程
》1个进程可以开启多条线程,每条线程可以并行执行不同的任务
》提高程序执行效率
》原理:多线程是假象,CPU只能同时执行1个线程,CPU快速在多条线程切换
》IOS开发建议3条左右,最多5条
》问题:线程太多浪费资源,反而降低效率,影响性能
》多线程程序复杂,线程之间的通信,
多线程IOS应用
》ios程序启动默认开启1条线程,即主线程或UI线程,有且只有1条
》子线程:从主线程中创建的线程分支
》主线程:显示/刷新UI界面,处理UI事件
》主线程不应执行比较耗时的操作,比如下载文件、加载图片、数据存储
判断代码在哪个线程执行
NSLog(@"%@", [NSThread currentThread]); // 主线程 NSLog(@"%@", [NSThread mainThread]); // 判断主线程 if([NSThread isMainThread]) |
IOS实现多线程的四种方案
pthread | C | 手动管理 | 不用 |
NSThread | OC | 手动管理 | 少用 |
GCD | C | 自动管理 | 常用 |
NSOperation | OC,基于GCD | 自动管理 | 常用 |
》线程状态
》1 pthread(C语言):不用,需要手动管理
》2 NSThread(OC语言)少用,手动管理
创建分支线程并自动启动
隐式启动线程并执行
睡眠阻塞
中断线程,中断之后线程被销毁,不能重新start
[NSThread exit] |
多线程安全隐患,数据错乱
》使用同步锁解决问题,@synchronized(self)传入的对象可以是任何唯一对象,一般使用self
》优点:防止多线程抢夺同一资源
缺点:耗内存和CPU,影响性能
》线程同步:让多条线程在同一条线上执行,相对于线程并发,使用synchronized解决
》atomic和nonatomic,atomic为属性的setter方法加锁,但比较耗内存,不建议使用
》加载完数据后回到主线程更新UI,waitUntilDone表示是否在执行完当前代码后再继续执行下面的代码
》3 GCD(C语言)常用,自动管理
Grand Central Dispatch,牛X的中枢调控器
多核运行优化解决方案
取消线程概念(自动管理线程)
C语言函数库
两个概念:任务、队列
》同步dispatch_sync,在当前线程中执行,不开启其它线程
异步dispatch_async,开启新线程执行
》异步并发队列(最常用),一般同时开多条线程
》异步串行队列(手动创建),一般只开一条线程
》异步主队列,不开新线程
》同步并发(逻辑错误,不用)
同步说明不开新线程,所以没有并发
》同步串行(不用)
同步就是串行执行
》同步主队列(不能用)
循环等待,无法正常执行
》4 NSOperation(OC语言,基于GCD)常用,自动管理
-->>MJ - 0916 - 多线程2<<--
》Foundation和Core Foundation框架的数据类型可以相互转换
小知识点
1. UIButton使用system模式不能设置image
2. 属性名不能以new、init开头,会被编译器识别为构造方法
3. 只有以initWith开头的类方法才能使用self
4. 使用xib是注意手势识别器,手势识别器也作为一个对象存在,所以使用lastObject方法获取控件时会出错
5. xib查找规则
xib名称不能和控制器除Controller外的部分一样
6. 直接在项目中修改xib的名称,建议clean一下项目
MJ - 0915 - 多线程1