coroutine是轻巧的执行线,以后可以暂停并恢复。已经有很多文章或主题涵盖了这一点,但是这篇文章是不同的,它很简单,可以让您更轻松地开始。它将覆盖以下部分:
- Introduction to Coroutine in Kotlin(本文)
- Non-blocking in Kotlin Coroutines
- 开始并暂停在科特林(本周接入)
概述
像许多其他编程语言一样,例如JS,Python,Coroutine是Kotlin提供的功能,使我们能够执行长时间且耗时的任务。简而言之:
在Kotlin中,Coroutines是一种以更顺序,易于阅读的方式编写异步,非阻滞代码的方法。
实际上,这里没有什么新技术。我们可以将Kotlin Coroutine视为一个框架/库,在处理异步时封装了一些常见用法。
在Kotlin中使用Coroutines的简单示例
要在Kotlin使用Coroutines,您需要在项目中包括kotlinx-coroutines-core
库。在您的应用Gradle文件中(Intellij项目下只有一个Gradle文件,或者如果是Android项目,请选择应用程序的Gradle文件),添加以下行:
dependencies {
testImplementation(kotlin("test-junit"))
implementation(kotlin("stdlib-jdk8"))
// add coroutine dependency
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2")
}
然后,您可以使用suspend
关键字将函数标记为coroutine,并使用launch
或async
函数来启动coroutine。
1.使用launch
创建Coroutines
这是使用Coroutine在背景中执行长期运行任务的示例:
import kotlinx.coroutines.*
fun main() {
// Start a coroutine using the launch function
val job = GlobalScope.launch {
// Perform a long-running task in the background
delay(1000L)
println("Hello, world!")
}
// Wait for the coroutine to finish
runBlocking {
job.join()
}
}
https://gist.github.com/arkilis/6cdd2d4ad1d30e5852cd1a46210833e0
在此示例中,launch
函数在后台启动了一个coroutine,并返回一个可以用来等待coroutine完成的Job
对象。 delay
函数是悬浮函数,可在给定的时间内悬挂coroutine。
2.使用async
创建Coroutines
这是一个在Kotlin中使用Coroutines并行执行多个任务的示例,然后等待所有任务完成:
import kotlinx.coroutines.*
fun main() {
// Start two coroutines using the async function
val job1 = GlobalScope.async {
// Perform a long-running task in the background
delay(1000L)
println("Task 1")
}
val job2 = GlobalScope.async {
// Perform a different long-running task in the background
delay(2000L)
println("Task 2")
}
// Wait for both coroutines to finish
runBlocking {
job1.await()
job2.await()
}
}
在此示例中,async
函数用于在后台启动两个coroutines。 await
功能用于等待Coroutines完成。因为坐标正在同时运行,所以任务是并行执行的,并且输出按任务完成的顺序打印。
启动和异步之间的区别
它们两个通常用于启动Coroutine。两者之间的主要区别在于,launch
返回工作(不可取消的未来),并且不返回结果,而async
返回了延期(不可取消的未来未来,结果)可用于获得Coroutine的结果。考虑到差异,何时应该使用启动和异步来创建coroutines:
- 当您使用
launch
函数时,Coroutine将在后台运行,功能调用将立即返回。当不需要Coroutine的结果时使用它。 - 当您使用
async
函数时,coroutine也将在后台运行,功能调用将立即返回,但是它将返回一个Deferred
对象,您可以在其上调用.await()函数以获取coroutine的结果。当需要Coroutine的结果时使用它。例如:
val result = GlobalScope.async {
return@async URL("https://api.example.com/data").readText()
}
val data = result.await()
println(data)
// output: {"fact":"A group of cats is called a \u201cclowder.\u201d","length":38}
概括
Coroutines可以使在Kotlin中编写并发和同步代码更容易,而是一些尖端技术,而是Kotlin提供的线程包装。
还有什么?众所周知,Coroutine是一个很大的话题,很少有人可以解释所有问题。这是Coroutine系列的第一篇文章。如果您有兴趣,请订阅有关此信息的更多文章:
- Non-blocking in Kotlin Coroutines
- 开始并暂停在科特林(本周接入)
要了解有关Coroutines以及如何使用它们的更多信息,您可以在https://kotlinlang.org/docs/reference/coroutines/coroutines-guide.html上阅读官方文档。