2. 等待协程完成
任务说明
在Kotlin协程中,launch启动的协程默认是并发的,主线程不会自动等待其完成。本案例要求使用join()函数挂起当前协程,直到目标子协程执行完毕,从而确保主流程在子协程结束后再继续。
核心实现
import kotlinx.coroutines.*
fun main() = runBlocking {
// 启动一个子协程,模拟耗时任务
val job = launch {
repeat(3) { index ->
delay(500) // 模拟耗时操作
println("子协程执行中: ${index + 1}/3")
}
println("子协程执行完毕")
}
println("主线程:等待子协程完成...")
job.join() // 挂起主协程,直到子协程结束
println("主线程:子协程已结束,继续执行")
}
代码说明
runBlocking创建主协程作用域,launch启动子协程并返回Job对象。调用job.join()后,主协程会挂起等待,直到子协程全部执行完成(包括repeat循环和最后的打印语句)。若去掉join(),主协程会立即执行到最后一行,子协程可能尚未完成。
执行流程
主线程:等待子协程完成...
子协程执行中: 1/3
子协程执行中: 2/3
子协程执行中: 3/3
子协程执行完毕
主线程:子协程已结束,继续执行
验证方式
直接运行上述代码,观察输出顺序。若join()生效,最后一行“主线程:子协程已结束”必然在“子协程执行完毕”之后打印;若注释掉job.join()再运行,最后一行会提前到最前面输出,由此可验证join()的等待效果。
关键点
join()是Job的挂起函数,只能在协程或挂起函数中调用- 等待期间主协程不阻塞线程,而是让出执行权
- 若子协程已执行完毕,
join()会立即返回