关于runBlocking的阻塞问题


#1

如图所示,文中有提到,调用了 runblocking 的线程会阻塞直到内部的协程执行完毕。


但是我的另外一个代码如下所示:

suspend fun testDelay() {
    logt(1)
    val job = GlobalScope.launch() {
        logt(2)
        delay(1000)
        logt(3)
    }
    logt(4)
}
fun main() = runBlocking{
     testDelay()
     logt("end")
}

这里的输出没有输出3,让我很意外:
image

针对这个问题,请教下各位前辈和老师!


#2
public suspend fun delay(timeMillis: Long) {
    if (timeMillis <= 0) return // don't delay
    return suspendCancellableCoroutine sc@ { cont: CancellableContinuation<Unit> ->
        cont.context.delay.scheduleResumeAfterDelay(timeMillis, cont)
    }
}

看源码,这个delay 简单理解就是阻隔的是你 runBlocking内新开的线程,都不是阻挠runBlocking开的那个,然后runBlocking内走完了,输入4,main就跑完了 GlobalScope.launch() 都没了
对比一下:

    runBlocking {
        println("A")
        GlobalScope.launch() {
            println("B")
            delay(1000)
            println("C")
        }
    }
    println("D")
    runBlocking {
        delay(1500L)
    }
A
B
D
C

Process finished with exit code 0

#3

注意 GlobalScope


#4

谢谢,类似这个吧:


京ICP备16022265号-2 Kotlin China 2017 - 2018