Дескриптор в Kotlin
Функция launch не только стартует корутину, но и
возвращает дескриптор - объект типа
Job. По нему видно, жива ли еще задача,
и позже можно явно дождаться завершения или
отменить работу.
Переменную с типом Job получают прямым
присваиванием результата launch внутри
runBlocking:
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val ticket: Job = launch {
delay(100)
println("ready")
}
println(ticket.isActive)
}
}
Сразу после старта флаг isActive обычно
true: корутина еще не завершилась. Когда
внутри напечатается "ready", задача
закроется, и тот же флаг станет ложным.
Несколько дескрипторов можно хранить отдельно, если фоновых задач больше одной:
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val north: Job = launch { println("N") }
val south: Job = launch { println("S") }
println(north.isActive)
println(south.isActive)
}
}
Сохраните результат фонового запуска с печатью
"job" в переменную типа Job.
До конца runBlocking выведите значение
isActive этой переменной.
Запустите две фоновые задачи с метками
"one" и "two". Для каждой
храните свой Job и напечатайте оба
флага isActive подряд в одной строке
через пробел.