Подпрограмма Kotlin runBlocking Coroutine должна блокировать текущий поток, пока сопрограмма внутри блока не завершит выполнение, но, похоже, этого не происходит, когда сопрограмма внутри блока имеет значение GlobalScope.launch
Я пытаюсь понять, как работают сопрограммы Котлина, и читаю документацию здесь - https://kotlinlang.org/docs/reference/coroutines/basics.html
В примере -
fun main() = runBlocking<Unit> { // start main coroutine
GlobalScope.launch { // launch new coroutine in background and continue
delay(1000L)
println("World!")
}
println("Hello,") // main coroutine continues here immediately
delay(2000L) // delaying for 2 seconds to keep JVM alive
}
Упоминается, что «основной поток, который вызывает runBlocking, блокируется до завершения сопрограммы внутри runBlocking». Если это так, то зачем нам двухсекундная задержка , чтобы заблокировать основной поток в конце runBlocking? Почему runBlocking не блокирует основной поток, пока не завершится GlobalScope.launch?
Однако следующий внутренний runBlocking блокирует основной поток до завершения функции задержки. Какая здесь разница? Почему не запускается блокировка в главном потоке вышеупомянутого блока, пока GlobalScope.launch не завершится аналогичным образом -
fun main(){ // start main coroutine
GlobalScope.launch { // launch new coroutine in background and continue
delay(1000L)
println("World!")
}
println("Hello,") // main coroutine continues here immediately
runBlocking{
delay(2000L) // delaying for 2 seconds to keep JVM alive
}
}
Я ожидаю, что когда основная функция обернута в подпрограмму runBlocking, главный поток должен быть заблокирован до тех пор, пока GlobalScope.launch не завершит свое выполнение.