Kotlin:在不同协程中接收元素无法正常工作

Kotlin: receiving elements in different coroutine is not working properly

我已经了解了 kotlin 协程代码。

    import kotlinx.coroutines.*
    import kotlinx.coroutines.channels.*

    fun main() = runBlocking <Unit> {
        val channel = Channel<Int>(4)
        val sender = launch (coroutineContext) {
            repeat(10) {
                println("sending $it")
                channel.send(it)
                delay(100)
            }
        }

        delay(1000)

        //launch {  for (y in channel) println("receiving $y") }

        for (y in channel) println("receiving $y")
    }

它工作正常。如果我将从通道接收元素的逻辑放入另一个协程(即,将 for 放入 launch 中,如注释代码中所示),那么它会在下面的输出处被击中(即,我期待发送和接收到 10,但卡在 receiving 3)。

    sending 0
    sending 1
    sending 2
    sending 3
    sending 4
    receiving 0
    receiving 1
    receiving 2
    receiving 3

如何在另一个协程中无故障地接收元素?

我使用的是版本 compile("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1")

原因是你的频道没有关闭,所以你的for-each循环可能永远不会结束。如果您在 repeat 块之后关闭您的频道,您的代码将正常完成:

进口kotlinx.coroutines。* 导入 kotlinx.coroutines.channels.*

fun main() = runBlocking <Unit> {
    val channel = Channel<Int>(4)
    val sender = launch (coroutineContext) {
        repeat(10) {
            println("sending $it")
            channel.send(it)
            delay(100)
        }
        channel.close()
    }

    delay(1000)

    launch {  for (y in channel) println("receiving $y") }

}