Введение в корутины в Kotlin
Обычный вызов функции держит поток до конца: пока считается сумма или читается файл, другая работа на этом потоке ждет. Корутина - другой способ организовать шаги: выполнение может остановиться на ожидании и позже продолжиться с того же места, не забивая поток бесконечным циклом.
Такой перерыв называют приостановкой. Снаружи это
похоже на паузу внутри одной логической задачи, хотя
поток в это время может обслуживать другие корутины.
Библиотека kotlinx.coroutines дает точку
входа и функции, которые умеют так останавливаться.
Для первого знакомства достаточно блока
runBlocking: он запускает корутину и не
отпускает текущий поток, пока внутренний код не
закончится. Внутри вызывают delay - паузу
на заданное число миллисекунд, которая не крутит
процессор вхолостую:
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
println("before")
delay(100)
println("after")
}
}
Между строками "before" и "after"
проходит короткая задержка, но программа не зависает
намертво: корутина приостанавливается, а после
таймера продолжает печать. Весь блок
runBlocking считается одной связной задачей
с точкой входа main.
Тот же каркас удобен, когда шагов несколько и между ними нужны паузы. Порядок сообщений в консоли сохраняется, хотя внутри работа то идет, то откладывается:
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
println("step 1")
delay(50)
println("step 2")
delay(50)
println("step 3")
}
println("done")
}
Строка "done" появляется только когда
внутренний блок полностью завершился. Так видно
границу корутины: снаружи runBlocking код
снова обычный, а внутри доступны приостанавливаемые
операции вроде delay.