Ожидание в Kotlin
Код после launch может выполниться раньше,
чем закончится фоновая лямбда. Метод join
у Job приостанавливает текущую корутину до
полного завершения выбранной задачи.
Так связывают основной поток шагов с результатом фоновой работы: сначала старт, затем явное ожидание, затем код, которому нужен готовый итог:
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val worker = launch {
delay(80)
println("done")
}
worker.join()
println("after")
}
}
"after" не появится раньше "done":
join блокирует родительскую корутину, но
не занимает поток крутящимся ожиданием.
Для двух задач порядок ожидания задают явно. Сначала дожидаются первой, потом второй, и только потом печатают общую метку:
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val early = launch {
delay(30)
println("early")
}
val late = launch {
delay(60)
println("late")
}
early.join()
late.join()
println("all")
}
}
Запустите фоновую корутину, которая после паузы
печатает "data". Дождитесь её через
join и выведите "saved".
Две фоновые задачи выводят "p" и
"q" с разной длительностью паузы.
После join для обеих напечатайте
"end".