在 Kotlin 中创建和执行协程
本文将介绍协程并展示如何在 Kotlin 中使用 async- await()
顺序或同时执行它们。
Kotlin 中的协程
协程可以被视为一个过程,除了它支持异步编程与其他仅支持同步编程的普通过程相比。
异步编程是一种技术,我们可以在某个点暂停任务的执行,并将执行委托给另一个任务,因为暂停的任务等待一些后台任务执行。这些后台任务可以包括从数据库读取记录、下载网页内容以及处理来自应用程序的用户请求。
在同步编程中,任务的执行在任何时候都不会挂起,线程是独占使用的,直到执行完成。
一个协程代表这个暂停的例程的实例。它也可以被视为一个线程,但是协程不依赖于底层线程,因为它可以在不同的线程上暂停和恢复执行。
在本教程中,我们将学习如何通过确保 async- await()
函数以正确的顺序执行来创建顺序和并发协同程序。
在 Kotlin 中创建一个新项目并添加依赖项
转到 IntelliJ 并选择 文件 > 新建 > 项目
。在打开的窗口中,输入 kotlinCoroutines
作为项目名称,在 Language 部分选择 Kotlin
,在 Build System 部分选择 Gradle
,然后按 Create
按钮。
要在 Kotlin 中使用协程,我们必须将协程依赖项添加到我们的应用程序中。转到文件 build.gradle.kts
并确保你具有以下依赖项。
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.2")
testImplementation(kotlin("test"))
}
确保你具有活动的 Internet 连接以下载依赖项。下载依赖项后,加载 Gradle 更改并继续执行后续步骤。
在 Kotlin 中按顺序创建和执行协程
在 kotlin
文件夹下创建包 com/coroutine
,这将是我们应用程序的基础包。在 coroutine
文件夹下创建一个 Main.kt
文件,并将以下代码复制并粘贴到该文件中。
package com.coroutine
import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
suspend fun executeProcedureOne(): Int{
delay(3000L)
println("procedure one executed")
return 50;
}
suspend fun executeProcedureTwo(): Int{
delay(1000L)
println("procedure two executed")
return 30;
}
fun main(): Unit = runBlocking {
val value = async {
executeProcedureOne()
}
value.await()
val secondValue = async {
executeProcedureTwo()
}
secondValue.await()
}
在上面的代码中,我们定义了两个方法,executeProcedureOne()
和 executeProcedureTwo()
,可以暂停执行一些后台任务。这是使用 suspend
关键字实现的,如上所示。
请注意
,这两种方法可以在不阻塞底层线程的情况下挂起。
我们已将 main 函数分配给名为 runBlocking
的函数。runBlocking
函数是一个构建器函数,它创建一个在主线程上运行的协程并被阻塞,直到函数内的协程完成执行。
在 runBlocking
函数中,我们创建了两个 async
函数,它们分别调用 executeProcedureOne()
和 executeProcedureTwo()
方法。
async
函数是一个协程构建器,它创建一个新的协程并返回一个 Deferred
。Deferred
是一个代表返回值的承诺的未来,我们可以使用 await()
来检索该值。
请注意
,在async
之后立即调用await()
将导致协程暂停,因为内部协程正在执行并在完成后恢复。
上面的代码在每个 async
函数强制协程暂停直到它完成并且可以转到其他协程之后,作为 await()
方法顺序执行。
运行上面的代码,注意 executeProcedureOne()
在 executeProcedureTwo()
之前完成,即使它延迟了最长时间。输出如下图所示。
procedure one executed
procedure two executed
在 Kotlin 中同时创建和执行协程
注释前面的代码,然后将下面的代码复制并粘贴到注释后的 Main.kt
文件中。
suspend fun executeProcedureOne(): Int{
delay(3000L)
println("procedure one executed")
return 50;
}
suspend fun executeProcedureTwo(): Int{
delay(1000L)
println("procedure two executed")
return 30;
}
suspend fun executeProcedures() = coroutineScope{
val firstValue = async {
executeProcedureOne()
}
val secondValue = async {
executeProcedureTwo()
}
firstValue.await()
secondValue.await()
}
fun main(): Unit = runBlocking {
executeProcedures()
}
我们已经将前面的示例修改为并发,通过在函数执行后将 async
协程构建器移动到另一个具有 coroutineScope
和 await()
的可挂起函数,以防止挂起协程。
coroutineScope
和 runBlocking
之间的区别在于 coroutineScope
被挂起并释放底层线程以继续执行其他任务。
运行上面的代码并注意 executeProcedureTwo()
方法首先执行,因为它比 executeProcedureOne()
方法具有更少的延迟。输出如下所示。
procedure two executed
procedure one executed
结论
在本文中,我们了解了协程是什么以及如何利用 async- await()
函数顺序或同时执行它们。我们还学习了协程上下文中的几个常见概念,包括异步编程、同步编程、runBlocking{}
函数和 coroutineScope{}
函数。
相关文章
如何在 Java 中延迟几秒钟的时间
发布时间:2023/12/17 浏览次数:217 分类:Java
-
本篇文章主要介绍如何在 Java 中制造程序延迟。本教程介绍了如何在 Java 中制造程序延时,并列举了一些示例代码来了解它。
如何在 Java 中把 Hashmap 转换为 JSON 对象
发布时间:2023/12/17 浏览次数:187 分类:Java
-
它描述了允许我们将哈希图转换为简单的 JSON 对象的方法。本文介绍了在 Java 中把 Hashmap 转换为 JSON 对象的方法。我们将看到关于创建一个 hashmap,然后将其转换为 JSON 对象的详细例子。
如何在 Java 中按值排序 Map
发布时间:2023/12/17 浏览次数:171 分类:Java
-
本文介绍了如何在 Java 中按值对 Map 进行排序。本教程介绍了如何在 Java 中按值对 Map
进行排序,并列出了一些示例代码来理解它。
如何在 Java 中打印 HashMap
发布时间:2023/12/17 浏览次数:192 分类:Java
-
本帖介绍了如何在 Java 中打印 HashMap。本教程介绍了如何在 Java 中打印 HashMap 元素,还列举了一些示例代码来理解这个主题。
在 Java 中更新 Hashmap 的值
发布时间:2023/12/17 浏览次数:146 分类:Java
-
本文介绍了如何在 Java 中更新 HashMap 中的一个值。本文介绍了如何在 Java 中使用 HashMap 类中包含的两个方法-put() 和 replace() 更新 HashMap 中的值。
Java 中的 hashmap 和 map 之间的区别
发布时间:2023/12/17 浏览次数:79 分类:Java
-
本文介绍了 Java 中的 hashmap 和 map 接口之间的区别。本教程介绍了 Java 中 Map 和 HashMap 之间的主要区别。在 Java 中,Map 是用于以键值对存储数据的接口,
在 Java 中获取用户主目录
发布时间:2023/12/17 浏览次数:218 分类:Java
-
这篇文章向你展示了如何在 Java 中获取用户主目录。本教程介绍了如何在 Java 中获取用户主目录,并列出了一些示例代码以指导你完成该主题。
Java 中 size 和 length 的区别
发布时间:2023/12/17 浏览次数:179 分类:Java
-
这篇文章教你如何知道 Java 中大小和长度之间的区别。本教程介绍了 Java 中大小和长度之间的区别。我们还列出了一些示例代码以帮助你理解该主题。
Java 中的互斥锁
发布时间:2023/12/17 浏览次数:111 分类:Java
-
了解有关 Java 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,