你的位置:首页 > 操作系统

[操作系统]iOS开发多线程理论介绍


前言

线程是用来执行任务的,线程彻底执行完任务A才能去执行任务B。为了同时执行两个任务,产生了多线程。

就我们日常生活的例子来说:

 (1)我打开一个视频软件,我开辟一个线程A让它执行下载任务,我开辟一个线程B,用来播放视频。我开辟两个线程后,这两个任务能同时执行,如果我开辟一个线程,只有下载任务完成,才能去执行播放任务。

 (2)线程相当于店里的服务员,一个服务员同时只能做一件事情,多顾几个服务员,就能同时做很多事情。

 

在了解多线程之前我们先来介绍一下进程和线程

进程

  进程是操作系统中运行的程序专业的讲,应用程序的执行实例不能执行任务进程在运行时候创建的资源随着进程的终止而死亡进程里面可以包含多个线程

线程

  线程是进程内部的一个独立的执行单元一个线程同时只能执行一个任务包含主线程(用户界面线程)和子线程(工作线程或后台线程)线程执行完毕就会销毁

 主线程:当应用程序启动时自动创建和启动,通常用来处理用户的输入并响应各种事件和消息主线程的终止意味着该程序的结束

 子线程:有主线程来创建,用来帮助主线程执行程序的后台处理任务,如果子线程A中创建了一个子线程B,在创建之后两者是相互独立的,多个子线程之间效果上是可以同时执行

  线程状态:五种线程状态 点击打开链接

多线程

  (1) 目前大多数的app,都需要连接服务器,而访问服务器的速度可能快也可能很慢。如果一个app访问服务器的操作没有在子线程操作的话,在该app访问服务器的过程中,该软件是不能响应用户的操作的,只有该app访问结束以后,app才能响应用户的操作,这就造成线程阻塞,也就是我们常见的卡顿现象。一条线程在同一时间内只能执行一个任务,但是进程可以有多条线程。可以开启多条线程来执行不同的任务,从而提高程序的执行效率,避免线程阻塞。

 (2) 每个线程都可以设置优先级,操作系统会根据线程的优先级来安排CPU的时间,优先级高的线程,优先调用的几率会更大,同级的话,执行的先后对线程执行的先后有影响

 (3)同一时间内,CPU只能处理一条线程,只有一条线程在工作。多线程并行执行,其实就是各个线程不断切换,因为执行切换的时间很快很快,就造成了同时执行的假象,原理如下,比如A,B两个线程;

     ①A执行到某一时间段要切换了,可A任务没完成,系统就会把A当前执行的位置和数据以入栈的方式保存起来

     ②然后B线程执行,B执行时间到了,它的位置状态等也会被系统保存到B的栈中。

     ③系统自动找到A的栈,将A之前保存的数据恢复,又可以从A之前断开的状态继续执行下去,如此循环

 (4)系统每开一个线程都有比较大的开销,若线程开的过多,不仅会占用大量内存和让城乡变得更加复杂,而且会加重CPU的负担,这样的软件,会让你省掉冬天买暖手宝的钱。

多线程优势

  (1)提高程序执行效率,避免线程阻塞造成的卡顿现象

  (2)能适当提高资源利用率(CPU,内存)

多线程的不足

 (1)开启线程需要占用一定的内存空间

 (2)线程越多,CPU在线程调度上的开销就越大

 (3)程序设计更加复杂:比如线程之间的通信、多线程的数据共享

 

总结

  线程与进程的关系

 线程是CPU执行任务的基本单位,一个进程可以有多个线程,但同时只能执行一个任务。

 进程就是运行中的软件,是动态的。

 一个操作系统可以对应多个进程,一个进程可以有多条线程,但至少有一个线程

 同一个进程内的线程共享进程里的资源

 

 主线程

 进程一启动就自动创建

 显示和刷新UI界面

 处理UI事件

 

 子线程的作用

 处理耗时的操作

 子线程不能用来刷新UI

 

三种多线程编程技术
 1. NSThread  
  NSThread是轻量级的多线程开发,使用并不复杂,但使用NSThread需要自己管理线程的声明周期。
 
  2. Cocoa NSOperation 
  使用NSOperation和NSOperationQueue进行多线程开发类似于线程池,只要将一个NSOperation(实际开发中需要使用其子类NSInvocationOperation、NSBlockOperation)放到NSOperationQueue这个队列中线程就会依次启动。NSOperationQueue负责管理、执行所有的NSOperation,在这个过程中可以更加容易管理线程总数和控制线程之间的依赖关系。

 NSOperation有两常用子类用于创建线程操作:NSInvocationOperation和NSBlockOperation,两种方式本质没有区别,但后者使用block形式进行代码组织,使用相对方便。


  3. GCD(Grand Central Dispatch)
  GCD是基于C语言开发的一套多线程开发机制,也是目前苹果官网推荐的多线程开发方法。

 GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程),程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码

 GCD是这三种多线程开发方式中抽象层次最高的,使用起来也是最为方便的,只是基于C语言开发,并不像前两种是面向对象开发,而是完全面向过程的。这种机制相比较于前面两种多线程开发方式最显著的优点就是它对于多核运算更加有效,会自动利用更多的CPU内核(比如双核、四核)。

 GCD中也有一个类似于NSOperationQueue的队列,GCD统一管理整个队列中的任务。但是GCD中的队列分为并行队列和串行队列两类:

 1、串行队列:只有一个线程,加入到队列中的操作按添加顺序依次执行。

 2、并发队列:有多个线程,操作进来以后他会将这些线程安排在可用的处理器上,同时保证先进来的任务优先处理。

 其实在GCD中还有一个特殊队列就是主队列,用来执行主线程上的操作任务。