启动协程
启动协程
协程有几个概念,您必须学习才能理解它们的内部工作。在深入研究这些概念之前,让我们尝试启动一些协程,以便我们可以使用手头的代码片段来分析这些概念。
查看本章中的代码[1],请使用 IntelliJ 打开本章的启动项目并选择 Open...,然后导航到 getting-started-with-coroutines/projects/starter 文件夹,选择 getting_started_with_coroutines 项目。
当项目打开时,找到并打开 Main.kt。在 Main.kt 中,您将看到以下代码:
fun main() {
(1..10000).forEach {
GlobalScope.launch {
val threadName = Thread.currentThread().name
println("$it printed on thread $threadName")
}
}
Thread.sleep(1000)
}
您启动的第一个协程很好理解:您将启动一万个协程!现在,启动一万个线程对于计算机来说有点无趣,因为大多数程序都会得到 OutOfMemoryException。但由于协程非常轻量级,您可以启动大量协程,而不会影响性能。
如果你运行上诉程序,你应该会看到很多文本输出,每一行都说明它正在打印哪个数字以及在哪个线程上打印。
在上面的代码段中有一些重要的事情需要注意。
首先,在启动协程时,您必须提供 CoroutineScope,因为它们是不真正关心其起点生命周期的后台机制。
如果程序在协程体完成之前结束会发生什么呢? 在这种情况下,您使用的是 GlobalScope,它明确表明协程的生命周期与应用程序的生命周期一致。因此,您还需要在 main 函数结束处调用 Thread.sleep(1000) 来暂停当前线程。
其次,launch 代码块中代码代表的是协程体,它作为参数传递给 launch,其中 launch 称为协程构建器。这些特殊的函数,可以根据您提供的配置构建运行您代码的协程,我们稍后再分析它们。
这是对您所写代码的基本解释,但这些解释性概念远比代码更复杂。在分析 CoroutineScope 是什么以及它是如何组合在一起的之前,让我们深入了解协程构建器。