Корутина в Kotlin — это легкая единица выполнения, которая позволяет писать асинхронный неблокирующий код более читаемым, последовательным способом. Она схожа с потоком (thread), но гораздо легче и может быть легко создана в большом количестве.
Основные компоненты и принципы работы:
suspend, могут приостанавливать (suspend) свое выполнение, не блокируя поток, в котором они выполняются. Когда приостановленная функция завершает свою "ожидающую" операцию (например, сетевой запрос), она может возобновить выполнение с того места, где была приостановлена.Job: Дескриптор корутины, позволяющий управлять ее жизненным циклом (отмена, ожидание завершения).CoroutineDispatcher: Определяет поток(и), в котором будет выполняться корутина. Позволяет переключаться между потоками.CoroutineName: Опциональное имя для отладки.CoroutineExceptionHandler: Обработчик необработанных исключений.launch: Запускает новую корутину, не возвращая результат. Возвращает Job.async: Запускает новую корутину, возвращающую результат (Deferred). Для получения результата используется .await().runBlocking: Блокирующий построитель, используемый в основном для тестирования или интеграции с блокирующим кодом.Как это работает под капотом:
Корутины не создают отдельные потоки для каждой задачи. Вместо этого, при приостановке suspend функции, компилятор генерирует код, который сохраняет текущее состояние вычислений. Когда результат доступен, корутина возобновляется на одном из потоков, управляемых CoroutineDispatcher'ом. Это достигается за счет преобразования suspend функций в конечном итоге в асинхронные вызовы с продолжениями (continuation-passing style), что позволяет одному потоку выполнять множество корутин, переключаясь между ними при приостановке.
Пример:
kotlin
Вывод этого кода будет:
plaintext
Это демонстрирует неблокирующий характер launch и delay.