Skip to content

Channel

更新: 4/16/2026 字数: 0 字 时长: 0 分钟

Kotlin中的Channel类似于BlockingQueue,但是其所有的阻塞操作在协程的实现下都变成了挂起操作,这使得我们的资源得到了很好的利用

kotlin
fun main() = runBlocking {
//sampleStart
    val channel = Channel<Int>()
    launch {
        // 这里可能是消耗大量 CPU 运算的异步逻辑,
        // 我们将仅仅做 5 次整数的平方并发送
        for (x in 1..5) channel.send(x * x)
    }
    // 这里我们打印了 5 次被接收的整数:
    repeat(5) { println(channel.receive()) }
    println("Done!")
//sampleEnd
}

上面的代码中,每当channel.send()发送一个数字,channel.receive()就会立刻接收到一个数字

close在channel中是安全关闭的含义,也就是只有确保队列中所有元素全部弹出,channel才会关闭

Kotlin中为我们提供了produce函数,这是一个实验性API,可以作为生产者向一个Channel中源源不断的生产数据,并将这个Channel返回回去

kotlin
val channel = produce {  
    for (x in 1..5) {  
        send(x * x)  
        println("已发送$x")  
    }  
    close()  
}  
// 这里我们使用 `for` 循环来打印所有被接收到的元素(直到通道被关闭)  
for (y in channel) println("已接受$y")  
println("Done!")
本站访客数 人次      本站总访问量