欢迎来到风尚网
风尚网首页 > 首页 > 阅读 > iOS开发之多线程理论部分

iOS开发之多线程理论部分

作者:涅槃广广 2016-02-19 09:12 来源:简书 编辑:美朵

文章摘要
Waht(理解多线程之前要先了解进程和线程)进程进程是应用程序的执行实例,简单来说就是在操作系统中运行的程序。例如我在手机上只打开QQ和微信这两个软件,系统中就会有两个进程存在。进程在运行时创建的资源随着进程的终止而死亡。线程进程本身是不能执行任务的,进程想要执行任务必须的有线程,线程是进程内部的一个独立的执行单元,同时只能执行一个任务,相当于一个子程序。线程被分为两种,主线程(用户界面线程)和子线程(工作线程或称为后台线程)。主线程(也称父线程):当应用程序启动时...
  • Waht(理解多线程之前要先了解进程和线程)

    1. 进程

      • 进程是应用程序的执行实例,简单来说就是在操作系统中运行的程序。

        例如我在手机上只打开QQ和微信这两个软件,系统中就会有两个进程存在。

      • 进程在运行时创建的资源随着进程的终止而死亡。

    2. 线程

      • 进程本身是不能执行任务的,进程想要执行任务必须的有线程,线程是进程内部的一个独立的执行单元,同时只能执行一个任务,相当于一个子程序。线程被分为两种,主线程(用户界面线程)和子线程(工作线程或称为后台线程)。

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

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

      • 一个进程中可以有多个线程,并且所有线程都在该进程的虚拟地址空间中,可以使用进程的全局变量和系统资源。

    3. 多线程

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

        可以开启多条线程来执行不同的任务,从而提高程序的执行效率,避免线程阻塞。

      • 操作系统会根据线程的优先级(线程的优先级可以手动设置)来安排CPU的时间,优先级高的线程,优先调用的几率会更大,同级的话,看线程执行的先后。

      • 同一时间内,CPU只能处理一条线程,只有一条线程在工作。多线程并行执行,其实就是各个线程不断切换轮流执行的假象。

        它们每个线程轮流占用的时间片很短很短,人是察觉不到的。而且并不是每个线程都必须执行完才发生切换,原理:

        1. 新创建一个线程是处于新建状态,启动线程之后,线程就处于就绪状态,并且会把线程放入CPU中得可调度线程池中。

        2. 当CPU调度到线程之后,线程就处于运行状态.CPU调度其他线程话,线程又会处于就绪状态,所以说线程会在就绪状态和运行状态间来回切换。

        3. 当线程被sellp或遇到锁的时候,线程会处于阻塞状态,并且会把线程移出CPU中的可调度线程池,当线程sellp完或锁解开的时候,会把线程放回CPU中的可调度线程池,继续在就绪状态和运行状态间来回切换。

          线程中的任务执行完毕或者异常/强制退出的时候,系统就会把线程release(释放掉)。

      • 不管是几核处理器,CPU在同一时间内只能处理一条线程,多核只不过能够实现多线程之间更快速的调度。

      • 系统每开一个线程都有比较大的开销。若线程开的过多,不仅会占用大量内存和让程序变得更加复杂,而且会加重CPU的负担,这样的软件,会使你的手机在冬天变成暖手宝。

  • Why(为什么使用多线程)

    • 提高程序执行效率,避免线程阻塞造成的卡顿现象。
    • 能适当提高资源利用率(CPU,内存)。
  • 总结

    • 线程与进程的关系
      1. 线程是CPU执行任务的基本单位,一个进程同时只能执行一个任务。
      2. 进程就是运行中的软件,是动态的。

      3. 一个程序可以对应多个进程,一个进程可以有多条线程,但至少有一个线程
      4. 同一个进程内的线程共享进程里的资源
    • 主线程

      1. 进程一启动就自动创建
      2. 显示和刷新UI界面
      3. 处理UI事件
    • 子线程的作用

      1. 由主线程创建
      2. 处理耗时的操作
      3. 子线程不能用来刷新UI
  • How(三种多线程编程技术)

    • NSThread

      NSThread是轻量级的多线程开发,使用并不复杂,但使用NSThread需要自己管理线程的声明周期。

    • Cocoa NSOperation

      使用NSOperation和NSOperationQueue进行多线程开发类似于线程池,只要将一个NSOperation(实际开发中需要使用其子类NSInvocationOperation、NSBlockOperation)放到NSOperationQueue这个队列中线程就会依次启动。NSOperationQueue负责管理、执行所有的NSOperation,在这个过程中可以更加容易管理线程总数和控制线程之间的依赖关系。

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

    • GCD(Grand Central Dispatch)

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

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

      GCD中也有一个类似于NSOperationQueue的队列,GCD统一管理整个队列中的任务。

      但是GCD中的队列分为并行队列和串行队列两类:1、串行队列:只有一个线程,加入到队列中的操作按添加顺序依次执行。2、并发队列:有多个线程,操作进来以后他会将这些线程安排在可用的处理器上,同时保证先进来的任务优先处理。

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

小主,按键盘右方向键 → 翻页可以跳过片头呢

  

上一篇:Dreamweaver CS6 Mac破解版

  

下一篇:iOS开发之通知中心、KVC、KVO

  

本文标题:iOS开发之多线程理论部分

原文链接:http://i.she.vc/27760.html

和本文相似的内容:

    点击排行