Обычно вывод будет 1, 3, 2, 4, но строгая гарантия здесь — 4 печатается после завершения блока coroutineScope и его дочернего launch. Default не задаёт полный порядок всех println.
Порядок выполнения корутин внутри coroutineScope
Обычно вывод будет 1, 3, 2, 4, но строгая гарантия здесь — 4 печатается после завершения блока coroutineScope и его дочернего launch. Default не задаёт полный порядок всех println.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Какой результат будет напечатан после запуска следующего кода:
val coroutineContext = Job() + Dispatchers.Default
val mainScope = CoroutineScope(coroutineContext)
mainScope.launch {
launch {
println(1)
}
coroutineScope<Unit> {
launch {
delay(500)
println(2)
}
delay(100)
println(3)
}
println(4)
}
Ответ
Обычно вывод будет 1, 3, 2, 4, но строгая гарантия здесь — 4 печатается после завершения блока coroutineScope и его дочернего launch. Default не задаёт полный порядок всех println.
Число 1 печатается отдельным дочерним launch внешней корутины, а 2 — дочерним launch внутреннего scope. coroutineScope ждёт и своё тело с println(3), и внутреннюю задачу с println(2), прежде чем разрешить println(4). Точные задержки и положение 1 зависят от планировщика. Запустивший пример процесс должен дождаться внешней Job, иначе он может завершиться раньше вывода.