Kotlin coroutines Kotlin-协同路由通道-它们是否阻止调用线程?

Kotlin coroutines Kotlin-协同路由通道-它们是否阻止调用线程?,kotlin-coroutines,Kotlin Coroutines,我知道通道是实验性的,我们可以把通道想象成java中的阻塞队列。话虽如此,让我们看看这个简单的例子: 为什么它不打印所有50000个整数?我把它放在全球范围内。所以这一行:println(“来自通道$x”)应该被调用50000次。为什么没有呢 send是一个挂起函数,如果在另一端没有人接收/出列,它会阻止协同路由(不是线程)。这就是在协同程序世界中支持背压的方式。您的runBlocking仅重复5次迭代,并且您的主出口。通道内部队列的默认容量为1。这是一个所谓的会合频道,因为制作人和消费者必须会

我知道通道是实验性的,我们可以把通道想象成java中的阻塞队列。话虽如此,让我们看看这个简单的例子:


为什么它不打印所有50000个整数?我把它放在全球范围内。所以这一行:
println(“来自通道$x”)
应该被调用50000次。为什么没有呢

send是一个挂起函数,如果在另一端没有人接收/出列,它会阻止协同路由(不是线程)。这就是在协同程序世界中支持背压的方式。您的runBlocking仅重复5次迭代,并且您的主出口。

通道内部队列的默认容量为1。这是一个所谓的会合频道,因为制作人和消费者必须会面交换物品。由于您只消费五个项目,因此制作人只能生产其中五个项目,并在交付第六个项目之前暂停,此时您的整个程序将完成

因此,这里是对您的程序的修改,它将打印所有50000项:

fun main() {
    val channel = Channel<Int>(Channel.UNLIMITED)
    GlobalScope.launch {
        for (x in 1..50000) {
            println("from channel $x")
            channel.send(x * x)
        }
    }
    Thread.sleep(1000)
    println("Done!")
}
fun main(){
val通道=通道(通道无限)
环球镜发射{
对于(1..50000中的x){
println(“来自频道$x”)
频道发送(x*x)
}
}
线程。睡眠(1000)
println(“完成!”)
}

注意,这次不需要使用任何一个函数。

对于我来说,发送是一个挂起函数,这是关键。谢谢
 from channel 1
1
from channel 2
from channel 3
4
9
from channel 4
from channel 5
16
from channel 6
25
Done!
fun main() {
    val channel = Channel<Int>(Channel.UNLIMITED)
    GlobalScope.launch {
        for (x in 1..50000) {
            println("from channel $x")
            channel.send(x * x)
        }
    }
    Thread.sleep(1000)
    println("Done!")
}