kotlin - 协程的执行顺序?

标签 kotlin kotlin-coroutines

我运行代码A并获得结果A,运行代码B并获得结果B,

我认为结果B应该是结果B +,因为调用了b.await(),为什么执行未按预期进行?

代码A

fun main() = runBlocking { 
    val a = async {    
        //delay(200L) 
        println("A1")        
    }    

    val b = async {    
        //delay(100L) 
        println("A2")        
    } 


    //b.await()

    println("A3")
}

结果
A3
A1
A2

代码B
fun main() = runBlocking { 
    val a = async {    
        //delay(200L) 
        println("A1")        
    }    

    val b = async {    
        //delay(100L) 
        println("A2")        
    } 


    b.await()

    println("A3")
}

结果B
A1
A2
A3

结果B +
A2
A3
A1

添加了内容

顺便说一句,代码C获得结果B +

代码C
fun main() = runBlocking { 
    val a = async {    
        delay(200L) 
        println("A1")        
    }    

    val b = async {    
        delay(100L) 
        println("A2")        
    } 


    b.await()

    println("A3")
}

最佳答案

看来代码中的放置顺序也会影响调用。因为即使这样的代码:

fun main() = runBlocking {

    val a = async {
        delay(200L)
        println("A1")
    }

    val b = async {
        delay(200L)
        println("A2")
    }

    b.await()
    a.await()
    println("A3")

}

将输出:
A1
A2
A3

对于输出A2,A3,A1,可以使用:
fun main() = runBlocking {

    val a = async(start = CoroutineStart.LAZY) {
        //delay(200L)
        println("A1")
    }

    val b = async(start = CoroutineStart.LAZY) {
        //delay(200L)
        println("A2")
    }

    b.await()
    println("A3")
    a.await()
}

关于kotlin - 协程的执行顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61356749/

相关文章:

Android:在端口 9150 连接到 Tor SOCKS 代理抛出 `SocketException` ;仅当我安装 Tor Android 应用程序时才有效

generics - Kotlin 编译器的类型推断无法选择调用哪个方法(泛型有歧义)

kotlin - 如何从服务 Android 调用挂起功能?

android - 检测 Room 何时完成运行迁移

android - 为什么我无法在 lambda 函数下调用 kotlin 挂起函数

android - 在 Alert Dialog Builder 中启动协程

kotlin - 使用Kotlin函数作为Java SAM类型

android - 带有可点击链接的EditText,除非用户自行更改它,否则不可编辑/Kotlin,Android

asynchronous - 使用 kotlin 协程并行分解独立异步任务

java - Spring 集成: downloading only new or updated files from FTP server?