Как происходит выполнение и синхронизация async‑корутин

Будет напечатано 2 примерно через секунду: join ждёт завершения первой корутины, а await второй возвращает уже готовую строку.

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

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

Будет напечатано 2 примерно через секунду: join ждёт завершения первой корутины, а await второй возвращает уже готовую строку.

Подробный разбор

Ответ с пояснениями

Условие

Определите, какой текст появится в консоль после запуска следующего фрагмента кода.

val coroutineContext = Job() + Dispatchers.IO

val mainScope = CoroutineScope(coroutineContext)

mainScope.launch {
    val deferred1 = async {
        delay(1000)
        "1"
    }

    val deferred2 = async {
        delay(500)
        "2"
    }

    deferred1.join()
    println(deferred2.await())
}

Ответ

Будет напечатано 2 примерно через секунду: join ждёт завершения первой корутины, а await второй возвращает уже готовую строку.

Обе async запускаются до первого ожидания. Вторая завершает задержку примерно через 500 мс, первая — через 1000 мс. Затем deferred1.join() возвращает Unit, поэтому строка "1" никуда не выводится. deferred2.await() получает "2", и её печатает единственный println.

Это предполагает, что scope не отменён и процесс живёт достаточно долго. В самостоятельном консольном примере нужно дождаться внешнего launch; само создание CoroutineScope не удерживает main до завершения работы. Реальное время может быть больше из-за планирования.

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

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

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

Подробнее