協程有兩個概念,一個是協程作用域,第二個是協程,虛擬機首先會加載協程作用域包括子作用域,因此在各個作用域沒有delay的情況下,從上到下執行作用域中的代碼,執行完畢後再按照從上到下的順序執行協程中的代碼
fun main1() = runBlocking {
var order = 1
// this: CoroutineScope
for (i: Int in 1..300)
println("first$i:::${order++}")
launch {
// delay(200L)
// println("Task from runBlocking")
delay(2000)
for (i: Int in 1..300)
println("fourth$i:::${order++}")
}
for (i: Int in 1..300)
println("second$i:::${order++}")
coroutineScope {
// 創建⼀個新的協程作⽤域
launch {
for (i: Int in 1..300)
println("fifth$i:::${order++}")
// delay(500L)
// println("Task from nested launch")
// delay(100L)
// println("Task from coroutine scope") // 該⾏將在嵌套啓動之前執⾏打印
}
for (i: Int in 1..300)
println("third$i:::${order++}")
// println("Coroutine scope is over") // 該⾏將在嵌套結束之後纔會被打
}
for (i: Int in 1..300)
println("sixth$i:::${order++}")
}
協程作用域和協程中的代碼執行順序
first second third fourth fifth sixth