为什么这两个挂起功能在Kotlin中没有启动或aync的情况下可以运行?

为什么这两个挂起功能在Kotlin中没有启动或aync的情况下可以运行?,kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,我正在学习Kotlin的协同程序,我运行代码A并得到结果A 1:我很奇怪为什么两个挂起函数doJob1()和doJob2()都可以在没有launch或aync的情况下运行。你知道,正常情况就像代码1 2:我认为如果代码A可以运行,结果B是预期的。因为doJob1()中的代码delay(3000L)是3s,所以doJob2()将首先运行 代码A import kotlinx.coroutines.* import kotlin.system.* fun main() = runBlocking

我正在学习Kotlin的协同程序,我运行代码A并得到结果A

1:我很奇怪为什么两个挂起函数
doJob1()
doJob2()
都可以在没有
launch
aync
的情况下运行。你知道,正常情况就像代码1

2:我认为如果代码A可以运行,结果B是预期的。因为
doJob1()
中的代码
delay(3000L)
是3s,所以
doJob2()
将首先运行

代码A

import kotlinx.coroutines.*
import kotlin.system.*

fun main() = runBlocking {
    val time = measureTimeMillis {
        val one = doJob1()
        val two = doJob2()
        println("[testSequential] Result ${one + two}")
    }
    println("[testSequential] Completed in $time ms")   
}


suspend fun doJob1(): Int {
    println("Job1 Doing")
    delay(3000L) 
    println("Job1 Done")
    return 10
}

suspend fun doJob2(): Int {
    println("Job2 Doing")
    delay(1000L) 
    println("Job2 Done")
    return 20
}
Job1 Doing
Job1 Done
Job2 Doing
Job2 Done
[testSequential] Result 30
[testSequential] Completed in 4011 ms
结果A

import kotlinx.coroutines.*
import kotlin.system.*

fun main() = runBlocking {
    val time = measureTimeMillis {
        val one = doJob1()
        val two = doJob2()
        println("[testSequential] Result ${one + two}")
    }
    println("[testSequential] Completed in $time ms")   
}


suspend fun doJob1(): Int {
    println("Job1 Doing")
    delay(3000L) 
    println("Job1 Done")
    return 10
}

suspend fun doJob2(): Int {
    println("Job2 Doing")
    delay(1000L) 
    println("Job2 Done")
    return 20
}
Job1 Doing
Job1 Done
Job2 Doing
Job2 Done
[testSequential] Result 30
[testSequential] Completed in 4011 ms
结果B

Job1 Doing
Job2 Doing
Job2 Done
Job1 Done
[testSequential] Result 30
[testSequential] Completed in 4011 ms
代码1

fun main() = runBlocking {
    launch { doWorld() }  // It use launch
    println("Hello,")
}


suspend fun doWorld() {
    delay(1000L)
    println("World!")
}

runBlocking
启动一个协程,因此您可以从其块内调用挂起函数


您的代码按顺序调用
doJob1()
doJob2()
,因此它们按该顺序运行。如果希望它们同时运行,则需要使用
async
launch
启动新的协同路由,以启动它们中的每一个。

runBlocking
启动协同路由,因此可以从其块内调用挂起函数


您的代码按顺序调用
doJob1()
doJob2()
,因此它们按该顺序运行。如果希望它们同时运行,则需要使用
async
launch
启动新的协同程序来启动它们。

1。挂起函数只能从另一个挂起函数或在协同程序内部调用,而这正是在
runBlocking
块中调用这两个函数所要做的。2.除非您启动另一个与
launch
async
内部的协同程序以同时运行其他内容,否则
runBlocking
块中的所有代码都将按顺序执行。1。挂起函数只能从另一个挂起函数或在协同程序内部调用,而这正是在
runBlocking
块中调用这两个函数所要做的。2.除非您启动另一个与
launch
async
内部的协同程序以同时运行其他内容,否则
runBlocking
块中的所有代码都将按顺序执行。