Приостанавливаемая функция в Kotlin
Не каждую функцию можно прервать на паузу: компилятор
разрешает приостановку только там, где стоит
модификатор suspend. Такая функция
вызывается либо из другой suspend-функции,
либо из блока, который уже открыл корутинный
контекст, например внутри runBlocking.
Собственный шаг оформляют как suspend fun.
Внутри допустимы обычные выражения и вызовы других
приостанавливаемых функций, в том числе delay:
import kotlinx.coroutines.delay
suspend fun report(label: String) {
println(label)
delay(10)
}
Снаружи report напрямую из main
вызвать нельзя - нужен корутинный контекст. Блок
runBlocking его предоставляет:
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
suspend fun report(label: String) {
println(label)
delay(10)
}
fun main() {
runBlocking {
report("alpha")
report("beta")
}
}
Цепочку из нескольких suspend-функций
удобно собирать слоями: одна готовит данные, другая
печатает итог, обе вызываются из одного блока:
import kotlinx.coroutines.runBlocking
suspend fun loadCode(): String = "K-42"
suspend fun showCode() {
val code = loadCode()
println(code)
}
fun main() {
runBlocking {
showCode()
}
}
Объявите suspend-функцию, которая печатает
строку "ping". Запустите её два раза
подряд внутри runBlocking.
Сделайте suspend-функцию, возвращающую
число 7, и вторую, которая выводит
результат первой. Вызовите вторую из
runBlocking.