import kotlinx.coroutines.*
fun main() = runBlocking {
// 创建多个异步任务
val job1 = async { makeRequest1() }
val job2 = async { makeRequest2() }
// 等待所有任务完成
val result1 = job1.await()
val result2 = job2.await()
// 所有请求完成后执行的操作
performActionAfterAllRequests(result1, result2)
}
suspend fun makeRequest1(): String {
delay(1000) // 模拟网络请求延迟
return "Request 1 completed"
}
suspend fun makeRequest2(): String {
delay(1500) // 模拟网络请求延迟
return "Request 2 completed"
}
fun performActionAfterAllRequests(result1: String, result2: String) {
println("$result1 and $result2, now perform action.")
}
关键代码解释:
async
:用于创建一个异步任务,它会立即返回一个 Deferred
对象,这个对象代表一个尚未完成的异步计算。async
块中的代码会在一个新的协程中执行。
await
:调用 await
方法会暂停当前协程,直到对应的 Deferred
对象所代表的异步任务完成,并返回该异步任务的结果。在上述代码中,job1.await()
和 job2.await()
会等待 makeRequest1
和 makeRequest2
执行完毕,并获取它们的返回值。
runBlocking
:在 main
函数中使用 runBlocking
来启动一个顶层协程,它会阻塞当前线程,直到其内部的所有协程执行完毕。在实际的Android或其他应用场景中,可能会使用 GlobalScope.launch
等其他方式来启动协程,避免阻塞主线程。
suspend
:标记函数为挂起函数,挂起函数可以暂停执行并将控制权交回给调用者,直到某个条件满足(如异步操作完成)。makeRequest1
和 makeRequest2
函数被标记为 suspend
,因为它们模拟了异步的网络请求操作。
delay
:也是一个挂起函数,用于暂停当前协程指定的时间(以毫秒为单位),在这里用于模拟网络请求的延迟。