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】所有都完成后才执行。












网友评论