Android-kotlin协程

69 阅读1分钟

协程是什么

简单的说明协程就是一个能挂起并且待会儿恢复执行的工具。 协程是一种轻量级的用户态线程,其调度和管理完全由程序控制,不涉及操作系统的介入,避免了从用户态到内核态的切换。与传统的线程相比,协程的创建和销毁更快,切换开销更小。协程特别适合于IO密集型和异步IO的操作,能够显著提高程序的效率和响应速度。

线程是被分割CPU的资源,而协程是组织好的代码流程。

协程挂起和恢复底层是如何实现

底层关键是 Continuation、CPS和状态机,通过调度将事件放到Thread或者其他,先返回挂起状态(此时就是挂起),最终通过异步回调返回结果。

  1. 通过cps(Continuation Passing Style),协程在编译的时候会被转化为一个状态机,实现Continuation接口, 挂起函数后面的代码内容会被塞入状态机的下一个状态分支

  2. 当协程挂起时,它的执行状态会被保存在Continuation对象中,包括上下文和执行位置。挂起函数执行完毕后会继续调用Continuation.resumeWith()方法恢复执行

父子协程间的关系

  • 父协程被取消,则所有子协程都被取消。
  • 父协程需要等待所有子协程执行完毕之后才会最终进入完成状态
  • 子协程会继承父协程的协程上下文,如果自身有相同 key 的成员,则覆盖对应的 key,只在自身范围内生效