При показанных задержках вывод: Weather forecast, затем Sunny, затем Have a good day!. Задача температуры отменяется во время delay, до AssertionError.
Разбор поведения корутин в Kotlin – пример 3
При показанных задержках вывод: Weather forecast, затем Sunny, затем Have a good day!. Задача температуры отменяется во время delay, до AssertionError.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Нужно предсказать, какой вывод будет получен при запуске следующего кода.
import kotlinx.coroutines.*
fun main() {
runBlocking {
println("Weather forecast")
println(getWeatherReport())
println("Have a good day!")
}
}
suspend fun getWeatherReport() = coroutineScope {
val forecast = async { getForecast() }
val temperature = async { getTemperature() }
delay(200)
temperature.cancel()
"${forecast.await()}"
}
suspend fun getForecast(): String {
delay(1000)
return "Sunny"
}
suspend fun getTemperature(): String {
delay(500)
throw AssertionError("Temperature is invalid")
return "30 graduses"
}
Ответ
При показанных задержках вывод: Weather forecast, затем Sunny, затем Have a good day!. Задача температуры отменяется во время delay, до AssertionError.
temperature.cancel() через 200 мс отменяет её приостановку на 500 мс. Эта штатная отмена не срывает sibling forecast. coroutineScope ждёт завершения forecast и возвращает его строку примерно через секунду. Если бы ошибка температуры успела возникнуть до отмены, она отменила бы scope; последняя строка тогда не была бы достигнута.
Источник: kotlinlang.org.