美文网首页
Kotlin协程 runBlocking 和 coroutine

Kotlin协程 runBlocking 和 coroutine

作者: thishejue | 来源:发表于2024-02-27 15:05 被阅读0次
class Test {

    fun startTask() = runBlocking {
        println("...【插入任务T】需要造出\"盖子\"、\"标签\"、\"灌完可乐的瓶子\"")

        launch {
            println("......【T1】需要造\"盖子\",需要300ms")
            delay(300)
            println("......【T1】完成")
        }

        launch {
            println("......【T2】需要造\"标签\",需要900ms")
            delay(900)
            println("......【T2】完成(-->到这儿,实际所有T任务结束)")
        }

        coroutineScope { // 这里面的代码可以和coroutineScope之前的launch并发执行
            println("......【S】需要造出\"可乐\"、\"瓶子\"")

            launch {
                println(".........【S1】需要造\"瓶子\",需要600ms")
                delay(600)
                println(".........【S1】完成(-->到这儿,实际所有S任务结束)")
            }

            println(".........【S2】造出\"可乐\",完成")
        }

        // 在coroutineScope里所有代码结束之前,coroutineScope之后的代码不会执行

        println("......【T3】往瓶子里面灌可乐(-->一定是在S完成后执行)")
    }

}

fun main(args: Array<String>) {
    Test().startTask()
    println("【最后回到主流程】加盖子、贴标签")
}

输出log:

...【插入任务T】需要造出"盖子"、"标签"、"灌完可乐的瓶子"
......【S】需要造出"可乐"、"瓶子"
.........【S2】造出"可乐",完成
......【T1】需要造"盖子",需要300ms
......【T2】需要造"标签",需要900ms
.........【S1】需要造"瓶子",需要600ms
......【T1】完成
.........【S1】完成(-->到这儿,实际所有S任务结束)
......【T3】往瓶子里面灌可乐(-->一定是在S完成后执行)
......【T2】完成(-->到这儿,实际所有T任务结束)
【最后回到主流程】加盖子、贴标签

解析下:

  • runBlocking会阻塞线程,只有当runBlocking内所有协程(包括子协程)执行完成,才释放。如上,【最后回到主流程】一定等到所有"Task"执行完,才执行。

  • coroutineScope不会阻塞线程,coroutineScope内的所有协程可以和已经启动的协程并发执行。如上,【S1】、【T1】、【T2】可以并发执行。但是注意,coroutineScope之后的代码并不会被执行。如上,【T3】一定等到【S】所有都完成后才执行。

相关文章

网友评论

      本文标题:Kotlin协程 runBlocking 和 coroutine

      本文链接:https://www.haomeiwen.com/subject/ipntzdtx.html