Порядок выполнения корутин внутри coroutineScope

Обычно вывод будет 1, 3, 2, 4, но строгая гарантия здесь — 4 печатается после завершения блока coroutineScope и его дочернего launch. Default не задаёт полный порядок всех println.

Короткий ответ

Что ответить на собеседовании

Обычно вывод будет 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, иначе он может завершиться раньше вывода.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее