如何理解Kotlin中的协程过程

0g0grzrc  于 2022-11-16  发布在  Kotlin
关注(0)|答案(1)|浏览(107)

我正在用文档和一些例子学习协同程序测试一些例子,我发现在同一个协同程序范围内它是按顺序工作例如下面代码是按顺序工作

fun main() = runBlocking {
    coroutineScope {
        launch {
            delay(1000)
            println("Start")
        }
    }

    coroutineScope {
        launch {
            delay(2000)
            println("World2")
        }

        launch {
            delay(1000)
            println("World1")
        }

        println("Hello")
    }

    println("Done")

}

/*
Start
Hello
World1
World2
Done
*/

但是如果我这样改变上面的代码

fun main() = runBlocking {
    launch {
        delay(1000)
        println("Start")
    }

    coroutineScope {
        launch {
            delay(2000)
            println("World2")
        }

        launch {
            delay(1000)
            println("World1")
        }

        println("Hello")
    }

    println("Done")

}

/*
Hello
Start
World1
World2
Done
*/

删除第一个CoroutineScope,结果序列被改变。在我看来,我认为这是一个作业状态的问题,但不确定。有谁可以澄清这个问题吗?

osh3o9ms

osh3o9ms1#

coroutineScope会一直挂起直到它的所有子协程都执行完毕。在第一种情况下,coroutineScope会一直等到launch完成并输出Start,这就是为什么在控制台上会看到Start作为第一个输出。
在第二部分中,我们删除了coroutineScope,所以现在它只是启动了一个新的协程并进入下一步(launch不会挂起)。然后在coroutineScope中,您启动了另外两个协程(使用launch)并打印Hello。这就是为什么Hello首先被打印。所有其他的打印语句都在等待延迟完成。
1秒后,第一个launch完成并打印Start,然后是World1World2。现在,当这个coroutineScope完成时,程序控制移到最后一个print语句并打印Done

相关问题