本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点
在 Kotlin 中,async
和 await
是用于并发编程的关键工具。它们通常用于协程中,以实现异步编程模式。通过使用 async
和 await
,你可以编写简洁的代码来处理并行任务,还可以控制任务的执行顺序来实现串行任务。
并行任务
async
会启动一个新的协程,并在其中异步执行指定的代码块。它会立即返回一个 Deferred
对象,该对象代表未来的结果。await
是用于等待 Deferred
的结果,直到它的计算完成。
下面是一个简单的例子,演示如何使用 async
和 await
来并行执行两个异步任务:
import kotlinx.coroutines.*
fun main() = runBlocking {
val startTime = System.currentTimeMillis()
// 启动两个并行任务
val deferred1 = async { simulatedLongTask("Task 1", 1000L) }
val deferred2 = async { simulatedLongTask("Task 2", 1500L) }
// 等待两个任务都完成
val result1 = deferred1.await()
val result2 = deferred2.await()
println("Result1: $result1")
println("Result2: $result2")
val endTime = System.currentTimeMillis()
println("Total time: ${endTime - startTime} ms")
}
suspend fun simulatedLongTask(name: String, delayTime: Long): String {
println("$name started")
delay(delayTime) // 模拟长时间运行的任务
println("$name finished")
return "$name result"
}
在这个例子中,simulatedLongTask
模拟了一个长时间运行的任务。async
用于并行执行两个任务,这两个任务在等待完成时不会阻塞主线程。当所有任务完成时,await
收集它们的结果。
串行任务
尽管 async
和 await
可以用于并行处理,但它们也可以用于顺序执行任务。如果你在调用 async
的地方使用 await
,那么代码将是同步执行的:
import kotlinx.coroutines.*
fun main() = runBlocking {
val startTime = System.currentTimeMillis()
// 启动串行任务
val result1 = async { simulatedLongTask("Task 1", 1000L) }.await()
val result2 = async { simulatedLongTask("Task 2", 1500L) }.await()
println("Result1: $result1")
println("Result2: $result2")
val endTime = System.currentTimeMillis()
println("Total time: ${endTime - startTime} ms")
}
suspend fun simulatedLongTask(name: String, delayTime: Long): String {
println("$name started")
delay(delayTime) // 模拟长时间运行的任务
println("$name finished")
return "$name result"
}
在这个串行任务的示例中,每个任务在前一个任务完成后才开始执行。虽然仍然使用了 async
,但由于 await
紧随其后,所以任务是顺序执行的。
关键点
- 并行执行:使用
async
启动多个任务,并且在所有任务启动后使用await
收集结果。 - 串行执行:在每个任务后立即使用
await
,以确保下一个任务只有在当前任务完成后才启动。 runBlocking
:用来在主函数中启动协程,这在演示和划小范围测试中很有用,但在应用中,应使用更合适的结构如launch
或CoroutineScope
。
欢迎关注我的公众号AntDream查看更多精彩文章,领取面试资料!