Блокирующий запуск в Kotlin
Функция runBlocking создает корутину и связывает ее
с текущим потоком так, что вызывающий код не идет
дальше, пока внутренний блок не завершится. Так
удобно вызывать корутинный API из обычной
fun main без асинхронной оболочки.
Поведение «подождать до конца» видно, если после блока сразу печатать метку: сначала выполняется всё внутри, затем строка снаружи:
import kotlinx.coroutines.runBlocking
fun main() {
println("enter")
runBlocking {
println("inner")
}
println("leave")
}
Порядок в консоли всегда "enter", затем
"inner", затем "leave". Поток,
на котором работает main, не переходит к
"leave", пока корутина внутри
runBlocking не закончилась.
Тот же эффект сохраняется, когда внутри несколько шагов подряд без пауз: блок считается одним целым, и наружный код ждет последний шаг:
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
var sum = 0
for (n in 1..5) {
sum += n
}
println(sum)
}
println("finished")
}
Число 15 печатается до строки
"finished". Даже если тело блока
занимает заметное время, вызывающая сторона
остается на том же потоке и не продолжает
выполнение раньше времени.
В main выведите "open", затем
в runBlocking - "work", после
блока - "close". Убедитесь, что
"close" идет последней строкой.
Внутри runBlocking посчитайте произведение
чисел от 1 до 4 и выведите
результат. Сразу после блока напечатайте
"ok".