Kotlin 协程 - 入门概念

查看官网最新依赖版本

一、概念

  • 协程:本质就是线程框架。一套基于 Thread(线程) 封装的 工具API(就像 Java 的 Executor 、Android 的 AsyncTask Handler 以及 RxJava)。
  • 轻量:线程由系统调度,切换或阻塞有开销。协程是能人为的指定任务的执行顺序和线程(指定在哪类线程上执行,线程调度依旧是系统)。
  • 用户态:协程没有个数限制由程序控制(开发者),而线程是内核态需要依赖系统(CPU核心数)。
  • 挂起函数:挂起的是协程,本质同样是切线程做其他事情,只是做完了可以回来继续做之前的事。
  • 非阻塞式:单线程是阻塞式的,当前任务没做完就不会执行后面的代码,多线程是切到别的线程执行就不会阻塞之前的线程。协程借助 Kotlin 语言的简洁优势以及“挂起恢复”“的特性消除了 Java 多线程那样的回调嵌套,即原先串行写的代码现在并行来写(让串行嵌套的异步代码像同步那样并行编写)。
  • 结构化并发:父协程提供了一个作用域,子协程都在该作用域中被创建,子协程会继承父协程的上下文,通过Job双向传播取消和异常,由此构成了结构化并发的关系:
    • 子协程从父协程那里继承上下文,可被改写。
    • 父协程会等待所有子协程结束。
    • 当父协程被取消时,所有子协程也会被取消。
    • 当某个子协程发生异常,会连带取消整个协程。

二、协程 Coroutine

所有协程都是 AbstractContinuation 抽象类的子类,而它继承了 Job、CoroutineScope、Continuation。利用多态隐藏复杂实现细节只暴露出必要的API:在创建协程作用域对象的时候返回的是 CoroutineScope 类型指定上下文,在调用协程构建器时返回的是 Job 控制生命周期,在调用挂起函数传递的是 Continuation 用来挂起恢复。当创建一个协程对象的时候返回的是 Job 而不是 AbstractContinuation 具体的实现类,因为我们目的是按顺序执行逻辑任务以及控制协程的生死以及获取值,(利用多态)隐藏复杂实现细节只暴露出必要的API,而 CoroutineScope 和 Continuation 的作用是针对协程内部功能的实现。

public abstract class AbstractCoroutine<in T>(
    parentContext: CoroutineContext,
    initParentJob: Boolean,
    active: Boolean
) : JobSupport(active), Job, Continuation<T>, CoroutineScope { }
【子类】【说明】
BlockingCoroutinerunBlocking() 启动的协程对象
LazyStandaloneCoroutinelaunch() 启动的延迟执行的协程
StandaloneCoroutinelaunch() 启动的立即执行的协程
LazyDeferredCoroutineasync() 启动的延迟执行的协程
DeferredCoroutineasync() 启动的立即执行的协程
DispatchedCoroutinewithContext() 启动的协程
FlowCoroutineflow() 相关的协程

三、协程的三层包装

三层包装都实现了 Contineation 接口,通过装饰模式(后者持有前者)将各层组合在一起,每层实现了不同的功能,都是协程但不完整。

在这里插入图片描述

1层

CoroutineBuilder

协程构建器

launch() → Job → StandaloneCoroutine → AbstractCoroutine → Coroutine

async() → Deferred → DeferredCoroutine → AbstractCoroutine → Coroutine

返回的Job和Deferred封装了协程的状态并提供了取消协程的接口。

2层

Suspend Funtion

挂起函数

SuspendLambda → ContinuationImpl → BaseContinuationImpl → Coroutine

封装业务代码和执行顺序(invokeSuspend()函数),持有第一层包装(成员属性completion)。

3层

CoroutineDispatcher

协程调度器

DispatchedContinuation → Coroutine

封装线程调度逻辑(成员属性dispatcher),持有第二层包装(成员属性continuation)。

一些函数

currentCoroutineContext( )

public suspend inline fun currentCoroutineContext(): CoroutineContext = coroutineContext

获取当前协程的上下文。(在子协程中通过coroutineContext获取到的是父协程的上下文)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值