Фоновый запуск в Kotlin
Блок runBlocking может не только выполнять
шаги сам, но и порождать дочерние корутины.
Функция launch стартует задачу в фоне: вызывающий
код идет дальше, не дожидаясь конца лямбды в
launch.
Пока родительский блок не закончился, дочерние
корутины успевают выполниться. Два последовательных
launch с разными метками показывают, что
обе задачи стартуют из одного контекста:
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
launch {
delay(50)
println("first")
}
launch {
delay(50)
println("second")
}
}
}
Строки "first" и "second"
появляются после короткой паузы внутри каждой
задачи. Функция runBlocking в конце все равно
ждет завершения дочерних корутин, поэтому
main не выходит раньше их печати.
Если во втором launch пауза длиннее,
порядок сообщений смещается, но обе задачи
запускаются в том порядке, в каком написаны
вызовы:
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
launch {
delay(20)
println("A")
}
launch {
delay(40)
println("B")
}
}
}
В runBlocking запустите два фоновых
блока: в первом после паузы выведите
"red", во втором - "blue".
Паузы подберите так, чтобы "red"
появилась раньше.
Сразу после старта фоновой задачи с печатью
"bg" выведите "fg" из
основного тела runBlocking. Убедитесь,
что "fg" видна до "bg".