很适合处理"等待某个操作完成后再继续"的场景,
CompletableDeferred 有两个状态:
未完成 :调用 await() 的协程会挂起等待。
已完成:await() 立即返回结果,且后续 await() 都会拿到同一个结果。
它不能重复设置值,重复调用 complete() 会返回 false 并忽略第二次。
Kotlin
import kotlinx.coroutines.*
import kotlinx.coroutines.CompletableDeferred
suspend fun main() {
val deferred = CompletableDeferred<Int>()
// 协程 A:等待结果
val jobA = CoroutineScope(Dispatchers.Default).launch {
println("A 等待中...")
val value = deferred.await()
println("A 拿到结果: $value")
}
// 协程 B:模拟耗时操作后完成
val jobB = CoroutineScope(Dispatchers.Default).launch {
println("B 开始干活")
delay(1000)
deferred.complete(42)
println("B 完成,设置结果")
}
jobA.join()
jobB.join()
}
输出结果
Kotlin
A 等待中...
B 开始干活
B 完成,设置结果
A 拿到结果: 42