在 Kotlin 协程中,launch
、join
、async
和await
有着不同的用法和作用:
一、launch
用法:
launch
用于启动一个新的协程,它不返回结果。通常用于执行一些异步任务,不需要关心任务的返回值。
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
delay(1000)
println("Coroutine launched")
}
println("Main function continues")
}
特点:
- 快速启动一个协程,不会阻塞当前线程的执行。
- 无法直接获取协程的执行结果。
二、join
用法:
join
是一个挂起函数,用于等待一个由launch
启动的协程执行完成。通常在需要确保某个协程执行完毕后再继续执行后续代码时使用。
import kotlinx.coroutines.*
fun main() = runBlocking {
val job = launch {
delay(1000)
println("Coroutine launched")
}
job.join()
println("Coroutine completed")
}
特点:
- 挂起当前协程,直到目标协程执行完成。
- 只能用于等待由
launch
启动的协程,不能获取协程的返回值。
三、async
用法:
async
也用于启动一个新的协程,与launch
不同的是,它可以返回一个Deferred
对象,这个对象代表一个最终会有结果的异步任务。
import kotlinx.coroutines.*
fun main() = runBlocking {
val deferred = async {
delay(1000)
"Async result"
}
println("Main function continues")
}
特点:
- 启动一个可以返回结果的协程。
- 返回的
Deferred
对象可以在需要的时候获取协程的执行结果。
四、await
用法:
await
是一个挂起函数,用于获取由async
启动的协程的执行结果。通常在需要使用协程的返回值时使用。
import kotlinx.coroutines.*
fun main() = runBlocking {
val deferred = async {
delay(1000)
"Async result"
}
val result = deferred.await()
println(result)
}
特点:
- 挂起当前协程,直到
async
启动的协程执行完成并返回结果。 - 可以获取协程的执行结果,以便在后续代码中使用。
五、区别总结:
launch
用于启动一个不关心结果的协程,async
用于启动一个有结果的协程。join
用于等待launch
启动的协程执行完成,await
用于获取async
启动的协程的结果。launch
和join
组合适用于只需要执行异步任务而不关心结果的情况;async
和await
组合适用于需要获取异步任务结果的情况。