Когда вы используете runBlocking
, ваш код между { }
будет работать внутри CoroutineScope
. Если вы запускаете дочернюю сопрограмму внутри с launch
, она будет вести себя так, как вы ожидали, потому что родительская сопрограмма должна дождаться всех своих потомков, прежде чем завершить:
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
delay(1000L)
println("World!")
}
println("Hello, ")
}
Однако, когда вы используете GlobalScope.launch
чтобы запустить новую сопрограмму, она не будет привязана ни к одному из родителей, и поэтому ее не будут ждать, если вы не добавите job.join()
.
См. this :
Потомки сопрограммы
Когда сопрограмма запускается в CoroutineScope другой сопрограммы, она наследует свой контекст через CoroutineScope.coroutineContext, и задание новой сопрограммы становится дочерним по отношению к родительской сопрограмме. работа. Когда родительская сопрограмма отменяется, все ее дочерние элементы также рекурсивно удаляются.
Однако, когда GlobalScope используется для запуска сопрограммы, родительский элемент для задания новой сопрограммы отсутствует. Поэтому он не привязан к объему, из которого был запущен, и работает независимо.