首页 > 代码库 > 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实现多线程的四种方案

pthreadC手动管理不用
NSThreadOC手动管理少用
GCDC自动管理常用
NSOperationOC,基于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