Будет напечатано 2 примерно через секунду: join ждёт завершения первой корутины, а await второй возвращает уже готовую строку.
Как происходит выполнение и синхронизация async‑корутин
Будет напечатано 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 до завершения работы. Реальное время может быть больше из-за планирования.