CPU(工厂) 进程(车间) 线程(工人)
一个进程代表一个应用程序 CPU总是运行一个进程,其它进程处于非运行状态.一个进程可以包含多个线程.线程与线程之间可以共享进程的内存区域.
打开一个应用程序,系统会给我们创建一个线程,称为主线程 管理主界面的UI与内部循环机制(与界面相关的东西必须放在主线程中!!!) 压力比较大且会造成线程阻塞(界面卡),因此我们通过创建子线程来对主线程进行分压.
什么时候用多线程
1.网络请求(同步的) 2.文件读写(少) 3.大数据计算(冒泡) 4.数据库select
ios中多线程编程
在多线程的方法中需要添加自动释放池!!! 在应用程序打开的时候系统自动为主线程创建一个自动释放池,自己创建的子线程需要自己手动添加
NSThread;NSOperationQueue;NSOperation;NSObject;
GCD;(常用)
1.
NSThread轻量级 俩个方法- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument (需要手动开始 用start)
+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument (自动开始)
start(开始) cancel(结束)
2.
NSOperation(网络异步请求 用的最多 ios一般开10条线程) 是基类,在主线程中
NSOperationQueue(线程队列 一般同时请求超过10条 所以用队列) init在主线程中main在子线程中
线程队列一般配合单例使用
3.
NSObject 异步后台执行
[self performSelectorInBackground:@selector(aButtonAction) withObject:nil];
4.
GCD(Grand Central Dispatch) 苹果开发的技术,以优化应用程序支持多核心处理器和其他的对称多处理系统的系统,是建立在任务并行执行的线程池模式的基础上的,不用autorelease 是IOS4.0之后可用
GCD让程序平行排队执行任务 一个任务可以是一个函数或者是一个block,GCD的底层依然是用线程实现 GCD中得FIFO队列dispatch queue 保证先进先出
dispatch queue分为以下三种:
serial(同步执行):private dispatch queue最多同时运行1个子线程 每个队列中是同步执行的 同步队列与同步队列之间是并发的
concurrent(并发):global dispatch queue最多同时运行count个子线程 可以并发的执行多个任务,但是执行完成的顺序是随机的
main dispatch queue():在主线程上执行任务
如何返回主线程
方法只有两个:
1.GCD dispatch_get_main_queue()
2.NSObject - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;//除了GCD都用这个
线程互斥
两个人同时访问一个资源 (尽量不要在方法中对成员变量和属性操作)解决办法 加锁解锁 递归和循环容易造成死锁