zoukankan      html  css  js  c++  java
  • IOS中多线程的总结

          首先要知道线程和进程的区别。一个系统上运行的每一个应用程序都是一个线程。而进程中要执行的任务都是在线程上来实现的,所以说线程是进程的最小执行单元。

          进程最少要有一个线程。多线程,顾名思义就是多条线程。

          那么在ios开发中运用到的多线程都有哪些呢,都有什么区别的,下面我们就来详细的吐槽一波。

          说到多线程不得不提到POSix threads,简称PThreads。他是类Unix操作系统中管理线程的一套完整的API。具体的PThreads自己问一下性感迷人的度娘娘嘞!而Ios开发中我们碰到的线程管理具体的有3类,分别是:NSThreadNSOperation(NSOperationQueue)and GCD

    一、NSThread

          NSthread我们在开发中用的最多的就是用【NSThread  CurrentThread】来获取当前的线程。他在执行一些比较简单的单任务的时候还是比较好用的,但是当要执行多个任务,并且任务之间还存在一定的关联,有执行先后顺序,这时候NSThread就显得太薄弱了。

    二、GCD

          开发过程中我们用的最多的就是GCD了吧。他是基于C语言的一套多线程开发的API。使用起来很方便,我们不用管理线程的生命周期,只需要关注我们执行的任务以及任务之间的关联就可以了,GCD帮我们管理线程的生命周期。GCD归纳起来就是 队列 + 执行方式。也就是说我们需要把执行的任务放到队列中,然后以何种方式执行即可。

          至于队列,GCD为我们提供了两种队列:串行队列和并行队列,这里需要提到的是程序中已经存在的两个特殊的队列,他们分别是主队列(程序为我们创建的一个串行队列)和全局队列(程序为我们创建的一个并行队列)

          串行队列:串行队列,就是说在这个队列上的任务必须是一个接一个执行的,必须等待前面的一个任务执行完毕才可以继续执行下面的任务。而且串行队列不具备开启新线程的能力。

          并行队列:并行队列,就是说在这个队列上的任务不用等前面的任务执行完毕就可以执行其他的任务,他是等待任务执行的时候并发执行多个任务。而且并行队列具备开启新线程的能力,但是他不一定一定开启一个新的线程来执行任务,主要还是看CPU的调度。

          同步执行:必须等dispatch_sync() 函数中的blcok执行完毕才返回该函数,同时同步执行也不能开辟新的线程。

          异步执行:dispatch_async() 函数立刻返回,不用等里面的block执行完毕,可以理解为在下一个执行周期执行block中的任务。异步执行可以开启新的线程,但是不一定一定开启新的线程。

          下面说一下队列和执行方式的几种组合方式。

          1.串行队列 + 同步执行(这里的串行队列不能是主队列,因为会死锁)

     

          我们可以看到任务是按顺序执行的。

          2.串行队列 + 异步执行

          我们可以看到异步执行的时候dispatch_async() 函数并没用等block执行完毕就继续执行下面的任务了。在下一个执行周期的时候执行了block中的任务。

          3.并行队列 + 同步执行

            

          任务仍然是按顺序执行的。同步执行必须等block中的任务执行完毕才返回dispatch函数,然后才执行下面的任务

          4.并行队列 + 异步执行

            

          任务没有按顺序执行。

          GCD其他方面的功能       

          1. dispatch_after

          这个函数是用来延时执行任务用的

          可以看出在主队列中延时执行,那么任务是在主线程中执行的。如果在全局队列上延时执行,那么任务是在子线程中执行的。如果是在自定义的队列上执行,那么任务也是在子线程上执行的。

          2. dispatch_once

          这个函数就是只执行一次,在程序中用的最多的估计就是创建单例类的时候吧。

            

          我们可以看到程序调用了3次,但是dispatch_once只执行了一次。

          3. dispatch_group_async && dispatch_group_notify

          dispatch_group主要就是当任务执行有顺序的时候可以用到,假如有3个任务,A,B,C,现在想要实现A,B执行完毕之后再执行C。如下:

          当任务A和B执行完毕之后执行C。完美解决。

          4.dispatch_barrier_async

          这个函数我们称之为栅栏函数,用这个函数添加任务的时候,会查找当前队列中是否有在此任务之前添加的其他任务没有执行完毕,如果有,那么等待其他任务执行完毕再执行这个任务,同时在这个任务后面添加的任务必须等待这个栅栏函数任务执行完毕之后才能执行。

          case1

          case2

          case3

          case4

          5.dispatch_apply

          这个函数主要用来重复执行任务,该函数是一个同步函数,所以要注意在用的时候不能把任务添加到主线程中避免造成死锁。

     

            

          三、NSOperation 

          NSOperation是一个抽象类,我们可以理解为任务,我们一般不直接使用他,而是用他的两个子类NSBlockOperationNSInvocationOperation,或者我们自定义她的子类,下面我们就这几种用法详细讨论。

          1.自定义子类。

          自定义子类,我们需要做的就是在子类中重写父类的main方法,把自己的任务添加到main方法中然后 调用start方法执行任务即可。后面会说到NSOperationmQueue,他是用来管理任务的,我们等会再说。

          2.NSBlockOperation

          3.NSInvocationOperation

     

          4.NSOperationQueue

           operation创建好之后我们可以通过调用operation 的 start 方法来执行任务。而OperationQueue可以帮我们省去这些麻烦,我们创建好任务operation后直接把operation添加到queue中就可以了,queue帮我们管理任务的执行。queue中的任务是异步并发执行的。

         

  • 相关阅读:
    vue中用v-for循环出出来的div下面的span不给宽度也能相对于div居中
    日期格式化
    在vue中写一个跟着鼠标跑的div,div里面动态显示数据
    计算两个时间相差的分钟数,显示方式为(分钟数:秒数)
    vue中引入json数据,不用本地请求
    解决vue中模态框内数据和外面的数据绑定的问题
    使用js控制文本超出部分显示省略号
    vue自己写了一个div菜单,点击按钮展开,点击其他地方关闭这个div菜单
    解决SMON_SCN_TO_TIME_AUX表损坏故障
    Drop user 报ORA-00600 [KTSSDRP1]
  • 原文地址:https://www.cnblogs.com/danMing-love/p/7833837.html
Copyright © 2011-2022 走看看