Область в Kotlin
Вложенные launch внутри одной
suspend-функции должны завершиться, прежде
чем функция вернет управление. Для этого служит
coroutineScope: блок создает область,
где дочерние задачи привязаны к родителю, и не
заканчивается, пока все они не отработали.
Функция может напечатать метку до области, внутри запустить две фоновые корутины и только потом закончиться:
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
suspend fun runPair() = coroutineScope {
launch {
delay(40)
println("L")
}
launch {
delay(40)
println("R")
}
}
fun main() {
runBlocking {
println("start")
runPair()
println("finish")
}
}
"finish" идет после "L" и
"R": выход из coroutineScope
откладывается, пока живы дочерние Job.
Тот же каркас удобен, когда область вложена в
другую suspend-функцию без лишних
дескрипторов снаружи:
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
suspend fun emitTags() = coroutineScope {
launch { println("x") }
launch { println("y") }
}
fun main() {
runBlocking {
emitTags()
println("z")
}
}
Оформите suspend-функцию с
coroutineScope и двумя launch,
печатающими "m" и "n".
Вызовите её из runBlocking и после
выведите "tail".
Внутри области запустите три фоновые задачи с
метками "1", "2" и "3".
После полного завершения области напечатайте
"ok".