tgoop.com/kotlin_lib/522
Last Update:
🧵 Kotlin Coroutines без макияжа: что скрывается под капотом
Когда вы запускаете корутину с помощью launch
или async
, компилятор Kotlin создаёт специальный объект, реализующий интерфейс Continuation
. Этот объект содержит состояние выполнения корутины и позволяет ей приостанавливаться и возобновляться. Внутри него хранятся все локальные переменные и текущая точка выполнения.
🔄 Жизненный цикл корутины:
1. Создание — с помощью launch
или async
.
2. Запуск — автоматически или через start()
.
3. Приостановка — при вызове suspend
-функций, таких как delay()
или await()
.
4. Возобновление — после завершения асинхронной операции.
5. Завершение — когда весь код выполнен или корутина отменена.
🧠 Что такое Continuation
?Continuation
— это объект, представляющий состояние выполнения корутины. Он позволяет приостанавливать и возобновлять выполнение, сохраняя информацию о том, где именно корутина была приостановлена. Интерфейс Continuation
выглядит следующим образом:
interface Continuation<in T> {
val context: CoroutineContext
fun resumeWith(result: Result<T>)
}
📌 Пример:
suspend fun mySuspendFunction() {
println("Start")
delay(1000)
println("End")
}
launch {
mySuspendFunction()
}
Компилятор преобразует этот код в класс, который можно представить следующим образом:
class GeneratedContinuation extends SuspendLambda {
int label;
@Override
Object invokeSuspend(Object result) {
switch (label) {
case 0:
println("Start");
label = 1;
if (delay(1000, this) == COROUTINE_SUSPENDED)
return COROUTINE_SUSPENDED;
case 1:
println("End");
return Unit.INSTANCE;
}
throw new IllegalStateException();
}
}
Здесь
label
указывает на текущую точку выполнения внутри корутины. При каждом вызове suspend
-функции значение label
изменяется, чтобы указать, с какого места нужно продолжить выполнение после приостановки.https://habr.com/ru/articles/882988/
✍️ @kotlin_lib
BY Kotlin
Share with your friend now:
tgoop.com/kotlin_lib/522