Šta je korutina u Kotlinu i kako funkcioniše?
sobes.tech АИ
Одговор од АИ
Корутина у Kotlin-у је лака јединица извршавања која омогућава писање асинхроног неблокирајућег кода на читљивији и последователнији начин. Она је слична потоку (thread), али је много лакша и може се лако креирати у великом броју.
Основне компоненте и принципи рада:
- Suspend Functions (Suspendable Functions): Функције означене кључном речи
suspend, могу привремено зауставити (suspend) своје извршавање, без блокирања потока у коме се извршавају. Када функција која је привремено заустављена заврши своју "чекајућу" операцију (нпр. мрежски захтев), она може наставити са извршавањем од места где је заустављена. - Context (Coroutine context): Скуп елемената који управљају понашањем корутине. У контексту су:
Job: Дескриптор корутине који омогућава управљање њеним животним циклусом (отказивање, чекање на завршетак).CoroutineDispatcher: Одређује поток(ове) у којима ће се корутина извршавати. Омогућава прелазак између потока.CoroutineName: Опциони назив за дебаговање.CoroutineExceptionHandler: Обрађивач необрађених изузетака.
- Builders (Постројитељи): Функције које покрећу извршавање корутина:
launch: Покреће нову корутину, без враћања резултата. ВраћаJob.async: Покреће нову корутину која враћа резултат (Deferred). За добијање резултата користи се.await().runBlocking: Блокирајући постројитељ, користан за тестирање или интеграцију са блокирајућим кодом.
Како то ради испод хауба:
Корутине не креирају одвојене потоке за сваки задатак. Уместо тога, када се suspend функција привремено заустави, компајлер генерише код који чува тренутно стање извршавања. Када је резултат доступан, корутина се наставља на једном од потока којим управља CoroutineDispatcher. Ово се постиже трансформацијом suspend функција у асинхроне позиве са продолжењима (continuation-passing style), што омогућава једном потоку да извршава више корутина, прелазећи између њих при заустављању.
Пример:
import kotlinx.coroutines.*
fun main() = runBlocking { // Блокира тренутни поток до завршетка корутине унутар runBlocking
println("Прво")
launch { // Покрећемо нову корутину у позадини
delay(1000L) // Неблокирајуће кашњење од 1 секунде
println("После кашњења")
}
println("Затим") // Ова линија ће се извршити пре завршетка launch корутине
}
Излаз овог кода ће бити:
Прво
Затим
После кашњења
Ово демонстрира неблокирајући карактер launch и delay.