Docsify/language/kotlin/Kotlin协程.md
2023-02-24 18:06:17 +08:00

50 lines
2.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Kotlin协程从入门到入土
## 0x00 什么是协程
协程英文Coroutines是一种比线程更加轻量级的存在。
协程不是进程,也不是线程,它就是一个可以在某个地方挂起的特殊函数,并且可以重新在挂起处继续运行。所以说,协程与进程、线程相比,不是一个维度的概念。
协程已经在Python、JS等许多编程语言上有所实现一般情况下协程被认为是比线程更轻量级的异步事件处理方式所谓协程是在编程语言层面上对同时执行多个异步任务上的实现。
> 协程通过将复杂性放入库来简化异步编程。程序的逻辑可以在协程中顺序地表达,而底层库会为我们解决其异步性。该库可以将用户代码的相关部分包装为回调、订阅相关事件、在不同线程(甚至不同机器!)上调度执行,而代码则保持如同顺序执行一样简单。
>
> 协程是一种并发设计模式您可以在Android平台上使用它来简化异步执行的代码
简单来说,协程可以帮助开发者以同步方式编写异步代码,解决以往编写异步程序时出现的“回调地狱”的问题。
## 0x11 Kotlin上协程的分类
### 创建最简单的协程
先上代码:
```Kotlin
// 调用阻塞式协程
runBlocking {
Log.d("runBlocking", "启动一个协程")
}
// 调用launch启动协程
GlobalScope.launch {
Log.d("launch", "启动一个协程")
}
// 调用async启动协程
GlobalScope.async {
Log.d("async", "启动一个协程")
}
```
如上面代码所示Kotlin中创建启动协程主要有3种方式
1. runBlocking - 启动一个阻塞式协程协程体代码块内代码会阻塞所在线程返回值为泛型T就是在协程体内最后一行返回的数据类型
2. launch - 启动一个非阻塞式协程必须在协程作用域CoroutineScope内启动但不会阻塞所在线程返回值为Job
3. async - 启动一个非阻塞式协程必须在协程作用域CoroutineScope内启动但不会阻塞所在线程返回值为一个Deferred<T>T泛型为协程体内最后一行返回的数据类型
- 协程的返回类型
1. runBlocking的泛型返回值T
runBlocking在默认情况下类似于一个封装好的方法当然可以通过指定该方法运行的线程让这个方法不阻塞主线程这样就类似于我们在Java中的Thread并且将run方法执行的结果最终返回回来这里不做过多讨论。
2. launch的返回类型Job
3. async的返回类型Deferred<T>