多线程篇(一)
以下是对多线程的一些理解,如果有失偏颇之处,还望各位大神指出.
话不多说,直接进入!
1.什么是进程?
我们手机里面每一个应用程序称一个进程.
每个进程都至少会有一个主线程(main),需要时可以创建多个线程.
2.线程?
线程是程序中一个单一的顺序控制流程,单个进程中可以有多个线程来完成不同的任务.
(注:程序启动后,系统就会创建一个主线程(main),所有的UI控件都必须在主线程创建,因此也叫主线程为UI线程)
3.多线程?
单个进程中同时运行多个线程,完成不同的工作,称多线程.
思路拓展:
如果将所有的任务放在UI主线程里面操作,容易造成UI阻塞,也就是程序运行卡顿.现在苹果官方已经支持在后台处理一些事件,那么可以使用多线程将占据时间长的程序放到后台处理.
4.策略?
4.1.NSThread
4.2.Cocoa NSOperation
4.3.GCD
4.1.NSThread
考虑使用情况:
创建一个 NSThread对象管理一个线程.
要把 OC 中的方法,放到独立线程里面运行时,可以用此类方法.
当要执行一个长时间的任务时.
创建方法:
类方法,直接创建开启一个线程去完成一个任务.
+detachNewThreadSelector:toTarget:withObject:
减方法创建,不会直接创建,需要 start 一下.
-initWithTarget:selector:Object:
隐式创建方法:在后台创建一个线程.
-performSelectorInBackground:withObject:
使用 Nsthread 需要注意的问题.
4.2.NSOperationQueue
NSOperation对象是一个 single-shot(一次性)对象,当他执行完后就不能再次使用.需要用需要重新创建.
可以设置并发执行数量
可以设置队列里面线程的优先级(当摸个线程的任务需要先完成时.可以设置他的优先级)
-(void)cancel 的使用
-通知操作对象,应该停止执行.
-若收到消息时,操作已经完成,则对该操作无影响.
-若收到消息时,操作在操作队列中,但还未执行,则操作会被提前移除队列
4.3GCD(Grand Central Dispatch)
是 apple 开发的一个多核编程的较新的解决方案.
用于优化程序,支持多核处理器,以及其他对称多处理系统
他是一个在线程池模式的基础上执行的并行任务.在 Mac OS X10.6雪豹中首次推出,也可在 iOS 4及以上版本使用.
GCD 使用;
将耗时的计算放到主线程这之外,达到平滑 UI 的效果.
处理并发多线程
处理线程间依赖关系(主要涉及到线程队列中各个线程之间的优先级)
问题:当多个线程同步去访问同同一个资源的时候?
GCD 与多核运算的关系?
GCD 是 apple 针对多核处理器并行运算提出的解决方案
GCD 能充分发挥硬件的性能
GCD与 NSOperation之间的?
二者功效相同.
NSOperationQueue 是用 GCD 创建,是 GCD 的高级抽象.
GCD 只支持 FIFO 队列,而NSOperationQueue的队列操作可以重新排序(设置优先级)
NSOperationQueue支持操作间设置依赖关系,而 GCD 不支持(遵守 first infirst out先进先出).
5三者实际是用 部分代码
5 .1NSThread
5.2GCD
5.3NSOperationQueue
MyOperation 继承于NSOperation
maxConcurrentOperationCount 设置成1,那么能保证最大并发数为1,这样线程 就将一个一个完成.
篇幅有限,后面将针对每一种方式单独详细讲解.