kotlin 协程

188 阅读1分钟

kotlin 协程

CoroutineScope 协程作用域

coroutine 运行的范围,同时提供一个协程运行的上下文。

Coroutine 协程

协程是一个可暂停过程的实例。在概念上它与线程类似,具体来说,就是可以让一个代码块与其他代码同时运行。然而,协程并不会绑定到某一个特定的线程上。它可以在一个线程上暂停,然后在另一个线程上继续。

Coroutine Builders 协程构建器

有多种方法可以创建一个协程

  • launch 在一个协程作用域中启动一个子协程
  • async 在一个协程作用域中启动一个子协程,与 launch 的区别在于 async 方法返回一个 Deferred 对象,这个对象可以通过 await 方法暂停父协程,直到子协程完成计算返回结果后让父协程继续。
  • runBlocking 创建一个阻塞当前线程的协程,通常在测试中使用

Coroutine Scope Builders 协程作用域构建器

coroutineScope 可以创建一个协程作用域

协程上下文

协程运行的环境,包括协程名字,拦截器,调度器,异常处理等等

  • withContext 切换协程的上下文

suspend 挂起

被该关键字修饰的方法执行时会挂起(暂停)协程。

suspend 方法只能在协程或另一个 suspend 方法中调用,这意味着,在这个方法调用栈中,栈底一定是一个协程,而栈顶是 kotlin 已经实现好了的 suspend 方法,比如 suspendCancellableCoroutine 方法。

从实现原理上来讲,suspend 是通过 CPS (Continuation-Passing-Style) 方法将一个 callback 形式的方法转变成一个同步返回的方法。