在Kotlin官网上有一个例子描述runBlocking和coroutineScope区别:
作用域构建器-runBlocking和coroutineScope
描述为:它们都会等待其协程体以及所有子协程结束。 主要区别在于,runBlocking 方法会阻塞当前线程来等待, 而 coroutineScope 只是挂起,会释放底层线程用于其他用途。
如下代码,按照这个逻辑来理解,那输出结果应该为“1-5-2-3-4”,因为coroutineScope 协程不会阻塞当前线程,应该执行输出5的操作,但实际测试结果却是“1-2-3-4-5”,测试结果显示嵌入的这coroutineScope 即使挂起,也不会执行其之后的代码段,必须等待其执行结束后才会往下执行;这个结果我很难理解,似乎与其描述不符,明明说不会阻塞,那为什么没有往下执行呢?
@Test
fun testMet() = runBlocking { // this: CoroutineScope
launch {
delay(600L)
println("3")
}
println("1")
coroutineScope { // 创建一个协程作用域
launch {
delay(1000L)
println("4")
}
delay(500L)
println("2") // 这一行会在内嵌 launch 之前输出
}
println("5") // 这一行在内嵌 launch 执行完毕后才输出
}
网上看到一篇解释说明:深层次揭示runBlocking与coroutineScope之间的异同点
总结下来是:
1.在coroutineScope插入的地方将当前代码段分上-下两部分
2.coroutineScope的挂起不阻塞当前线程,可以理解为跳出当前协程
3.跳出后,只会执行插入点之上的代码段,而其之后的代码段则必须等到结束后才往下执行(关键点)
从上述描述来看,会让人觉着就是阻塞啊;目前,只能理解到这一层面,先记着这样理解,后续继续学习看能不能更好的来解释这块儿。
版权声明:本文为qq_25269161原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。