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!")