ios--多线程

来源:互联网 发布:魔方拼图软件 编辑:程序博客网 时间:2024/06/10 16:51

一、多线程基础

1.进程是系统中正在运行的一个应用程序,线程是进程执行的一个基本单元,一个进程要想执行任务必须要有线程(也就是说一个进程必须要有一个线程)。

2.多线程的原理:

(1)同一时间内cpu只处理一条线程,也就是说同一时间内只有一条县城工作。

(2)多线程并发执行时,其实是cpu快速的在各个线程之间调度。

(3)如果cpu调度线程的速度足够快的时候,就会造成多条线程并行的假象。

3.多线程的优缺点

(1)优点:能够适当的提高程序的执行效率,提高系统资源的利用率

(2)缺点:开启线程需要占用一定的资源,当线程多的时候,CPU在线程的调度上开销就会很大,并且程序的设计更加复杂(线程之间的数据共享,通信等)。

二、NSThread

1.创建方法:

(1)alloc方法,需要调用start函数;

(2)直接创建线程[NSThread detachNewThreadSelector:@selector(doSomeThing) toTarget:self withObject:nil];

(3)使用performSelectorInBackground创建一个线程一个线程,这种方法更加简单[self performSelectorInBackground:@selector(doSomeThing) withObject:nil];

2.线程的三种状态挂起,阻塞,运行,其实都是CPU调度的时机而已,简而言之就是,当线程阻塞时,CPU忙不过来,线程就会进入阻塞状态,当系统通知将要有有空余的资源时

线程进入挂起也就是进入就绪状态,系统资源充足时进入运行的状态。

3.线程之间的安全以及线程之间的通信

(1)线程之间的安全,一个进程中可能有多个线程一起运行,线程之间是共享进程的资源,当多个线程共用一块一块资源时就会产生许多不确定因素,所以线程安全也是很重要的,所以线程安全一般都涉及到synchronized 就是线程中的某块资源同一时间只能有一个线程来操作 不然中间过程可能会产生不可预制的结果

(2)线程之间的通信一般有种:(1)一个线程的数据传到另外一个线程中去  (2)一个线程完成任务继续到下一个线程继续执行任务。

三、GCD

1.GCD相比其他线程的优点:

(1)GCD 能通过推迟昂贵计算任务并在后台运行它们来改善你的应用的响应性能。

(2)GCD 提供一个易于使用的并发模型而不仅仅只是锁和线程,以帮助我们避开并发陷阱。

(3)GCD 具有在常见模式(例如单例)上用更高性能的原语优化你的代码的潜在能力,也就是利用代码块的形式,使程序看起来更加的简洁。

(4)GCD 会自动利用更多的CPU内核。

2.GCD的模式:串行,并行,同步,异步。

3.GCD任务的执行

(1)并发队列+同步执行,没有开辟心得线程,任务是一个接着一个完成的,相当于串行队列;

(2)并发队列+异步任务,开启了新线程,任务是并行执行的。

(3)全局队列+同步任务,没有开辟新的线程,任务是逐个完成的跟并行队列+同步任务是一样的。

(4)全局队列+异步任务,开启了新的线程,任务是并发执行的。

(5)串行队列+同步任务,没有开启心得线程,任务是逐个完成的,

(6)串行队列+异步任务,开启了新的线程,任务是逐个完成的

(7)主队列+异步操作都应该在主线程上顺序执行的,不存在异步的概念

三、NSOperation和NSOperationQueue

1.NSOperation分为:NSIvocationperation,NSBlockOperation,自定义

2.只有将NSOperation添加到NSOperationQueue中系统才能执行一步操作,有两种添加方法:addOperation 和 addOperationBlock;

3.NSOperation通信与依赖的关系

(1)NSOperation之间的通信,比如通过网络连接来获取图片,那么我们可以在addOperationWithBlock中添加下载图片的方法,当执行完成后我们可以利用【NSOperationQueue  mainQueue】 addOperationWithBlock中将图片显示,可以理解为子线程中下载主线程中刷新UI。

(2)NSOperation之间的依赖关系,也可以说线程之间的任务依赖,如果A依赖B,那么就是当A执行完成后在执行B,主要的方法是【A addDepenency:B】这个是前者依赖后者,当后者执行完成后才去执行执行前者,这里需要注意的是任务之间不能相互依赖,会造成死锁

4、NSOperation的挂起和并发数

(1)当我们开辟的线程多时,CPU的工作量会增大,这样会降低线程的调度次数,为了合理的安排CPU的工作,我们可以设置线程的并发数,充分的利用系统资源。

(2)当任务执行的时候,由于某些操作的执行,需要将当前执行的任务暂停,我们可以将Suspended设置为YES,这是当前队列挂起,也可以理解为暂停,但是需要我们注意的是:当当前任务是正在执行时,我们设置为挂起时不会影响当前任务的执行,而是那些还没有执行的任务是会受到影响的,我们在操作取消任务时,要在每个任务下面判断当前任务是否被取消,这样任务才能停止下来。

0 0
原创粉丝点击