美文网首页
kotlin协程

kotlin协程

作者: Mr_不靠谱_先森 | 来源:发表于2022-03-22 18:42 被阅读0次

    协程概述

    官方描述:协程通过将复杂性放入库来简化异步编程。程序的逻辑可以在协程中顺序地表达,而底层库会为我们解决其异步性。该库可以将用户代码的相关部分包装为回调、订阅相关事件、在不同线程(甚至不同机器)上调度执行,而代码则保持如同顺序执行一样简单。

    1. 协程是轻量级的线程

    线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程是有系统进行调度的,创建一个线程的代价是十分昂贵的, 需要给它分配内存、列入调度,同时在线程切换的时候还要执行内存换页,CPU 的缓存被清空,切换回来的时候还要重新从内存中读取信息,破坏了数据的局部性。

    协程是依赖与线程的,创建一个协程几乎是无代价的,同时协程也是由使用者控制的。一个线程中可以创建任意个协程,所以说协程是非常轻量级的。

    kotlin层面上来说,是伪协程

    1. 协程构造器 (Coroutine Builders)

      runBlocking:创建一个会阻塞当前线程的协程,直到协程结束,用于测试

      GlobalScope.launch:创建一个顶层的不会阻塞的协程,返回一个 Job 对象

      launch:创建一个不会阻塞当前线程、没有返回结果的 Coroutine,但会返回一个 Job 对象.需要在协程内使用

      withContext:创建一个可以返回执行结果的Coroutine.多个withContext之前是同步的.需要在协程内使用

      asyn:创建一个可以返回执行结果的Coroutine.多个asyn是异步的.需要在协程内使用

    2. 协程作用域(CoroutineScope)

      CoroutineScope管理该作用域里的所有协程.一个CoroutineScope可以拥有多个子CoroutineScope

      [图片上传失败...(image-37791b-1647945716958)]

    3. 协程取消(Job)

      Job是协程启动后的返回对象,可以通过Job来判断是当前协程的状态,也可以对此协程进行取消操作

                                         wait children
      +-----+ start  +--------+ complete   +-------------+  finish  +-----------+
      | New | -----> | Active | ---------> | Completing  | -------> | Completed |
      +-----+        +--------+            +-------------+          +-----------+
                       |  cancel / fail       |
                       |     +----------------+
                       |     |
                       V     V
                   +------------+                           finish  +-----------+
                   | Cancelling | --------------------------------> | Cancelled |
                   +------------+                                   +-----------+
      

      协程启动模式(CoroutineStart):

      DEFAULT:默认启动模式,立即执行
      LAZY:立即执行,并且开始执行前无法被取消

      ATOMIC:需要手动触发才会执行

      UNDISPATCHED:立即执行,直到遇到第一个挂起点

    1. 协程异常

      协程在使用的时候传入CoroutineExceptionHandler即可以捕获异常

      GlobalScope创建的协程自己处理,其他协程正常执行

      Job嵌套和coroutineScoope创建的协程会交给父job处理,并且取消所有的子协程

    1. 挂起函数 suspend

      CPS(Continuation-Passing-Style 续体传递风格)

      In functional programming, continuation-passing style (CPS) is a style of programming in which control is passed explicitly in the form of a continuation. (from Wikipedia.)

      假设我们约定一种编程规范,所有的函数都按照上述的方式来定义,即所有的函数都直接返回结果值,而是在参数列表最后的位置传入一个 callback 函数参数,并在函数执行完成时通过这个 callback 来处理结果,这种代码风格被称为延续传递风格(Continuation Passing Style)。这里的回调函数(callback)被称为是延续(continuation),即这个回调函数决定了程序接下来的行为,整个程序的逻辑就是通过一个个的延续而拼接在一起。

      状态机

      img

    引用:

    1.https://www.jianshu.com/p/2979732fb6fb

    2.https://blog.csdn.net/krossford/article/details/100145384

    相关文章

      网友评论

          本文标题:kotlin协程

          本文链接:https://www.haomeiwen.com/subject/lmhfjrtx.html