进程:进程是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内。
线程:1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程)线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行,比如使用酷狗播放音乐、使用迅雷下载电影,都需要在线程中执行。1个线程中任务的执行是串行的,如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务,也就是说,在同一时间内,1个线程只能执行1个任务,比如在1个线程中下载3个文件(分别是文件A、文件B、文件C)。
多线程:1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务,进程 ->车间,线程->车间工人,多线程技术可以提高程序的执行效率,比如同时开启3条线程分别下载3个文件(分别是文件A、文件B、文件C)。
多线程的原理
同一时间,CPU只能处理1条线程,只有1条线程在工作(执行)?多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换)?如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象?思考:如果线程非常非常多,会发生什么情况??CPU会在N多线程之间调度,CPU会累死,消耗大量的CPU资源?每条线程被调度执行的频次会降低(线程的执行效率降低)
相同之处:同时处理多线程
NSThread
优点:比起NSOperation GCD 更加轻量级 缺点:需要自己手动管理线程的周期和线程同步。
创建方式两种:
[NSThread detachNewThreadSelector:@selector(updateAnimation) toTarget:self withObject:nil];
- NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];
- [myThread start];
不显式创建线程的方法:
用NSObject的类方法 performSelectorInBackground:withObject: 创建一个线程:?[Obj performSelectorInBackground:@selector(doSomething) withObject:nil];
回到主线程
[self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];
NSOperation
优点:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上。
Cocoa operation 相关的类是 NSOperation ,NSOperationQueue。NSOperation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的两个子类:NSInvocationOperation(操作对象默认在主线程中执行,只有添加到队列中才会开启新的线程。) 和 NSBlockOperation(NSBlockOperation封装的操作数大于1,就会异步执行操作)。创建NSOperation子类的对象,把对象添加到NSOperationQueue队列里执行。
一种是用定义好的两个子类:
NSInvocationOperation 和 NSBlockOperation。
另一种是继承NSOperation
如果你也熟悉Java,NSOperation就和java.lang.Runnable接口很相似。和Java的Runnable一样,NSOperation也是设计用来扩展的,只需继承重写NSOperation的一个方法main。相当与java 中Runnalbe的Run方法。然后把NSOperation子类的对象放入NSOperationQueue队列中,该队列就会启动并开始处理它。
继承NSOperation
在.m文件中实现main方法,main方法编写要执行的代码即可。
队列里可以加入很多个NSOperation, 可以把NSOperationQueue看作一个线程池,可往线程池中添加操作(NSOperation)到队列中。线程池中的线程可看作消费者,从队列中取走操作,并执行它。
通过下面的代码设置:?[queue setMaxConcurrentOperationCount:5];?线程池中的线程数,也就是并发操作数。默认情况下是-1,-1表示没有限制,这样会同时运行队列中的全部的操作。
GCD
Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法。在iOS4.0开始之后才能使用。GCD是一个替代诸如NSThread, NSOperationQueue, NSInvocationOperation等技术的很高效和强大的技术。
Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统。这建立在任务并行执行的线程池模式的基础上的。它首次发布在Mac OS X 10.6 ,iOS 4及以上也可用。
GCD的工作原理是:让程序平行排队的特定任务,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务。
一个任务可以是一个函数(function)或者是一个block。 GCD的底层依然是用线程实现,不过这样可以让程序员不用关注实现的细节。
GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行
使用GCD进行编程,开发者要做的只是定义想执行的任务并追加到适当的Dispatch Queue中。其中,“定义想执行的任务”使用Block语法来完成。Dispatch Queue中的任务按照FIFO(先入先出)的顺序进行处理,也就是先进入的任务先处理。另外,Dispatch Queue分为串行和并行两种。
Serial VS Concurrent
Serial Dispatch Queue要求等待正在执行的任务完成,再执行下一个,也就是说只会创建一个线程来执行任务
Concurrent Dispatch Queue中后面的任务可以不必等待正在执行的任务执行完成就可以开始执行,也就是同时可以执行多个任务,也就是说会创建多个线程同时执行多个任务
一般情况下:如果要求在不能改变执行顺序或不想并行执行多个任务时使用Serial Dispatch Queue。
简言之:Serial Dispatch Queue串行代码;Concurrent Dispatch Queue并行代码。
Main Dispatch Queue & Global Dispatch Queue
系统为我们提供了两种调度队列 它们不需要我们创建 只是在我们使用时获取一下
dispatch_sync 同步添加操作,它是等待操作完成之后再继续执行。
dispatch_async 异步添加进任务队列,它不会做任何等待
同步提交任务需注意:调用此函数的队列和同步提交任务的目标队列都是当前队列话 会造成死锁