kotlin: channel的参数
一,代码:
//处理按钮点击事件
binding.button1.setOnClickListener {
runBlocking {
val channel = Channel<Int>()
//发送消息
launch {
(1..3).forEach {
channel.send(it)
logX("发送: $it")
}
channel.close() // 变化在这里
}
//接收消息
launch {
for (i in channel) {
logX("接收: $i")
}
}
logX("代码结束")
}
}
//处理按钮点击事件
binding.button2.setOnClickListener {
runBlocking {
// 变化在这里
val channel = Channel<Int>(capacity = Channel.Factory.UNLIMITED)
launch {
(1..3).forEach {
channel.send(it)
println("发送: $it")
}
channel.close() // 变化在这里
}
launch {
for (i in channel) {
println("接收: $i")
}
}
println("end")
}
}
//处理按钮点击事件
binding.button3.setOnClickListener {
runBlocking {
// 变化在这里
val channel = Channel<Int>(capacity = Channel.Factory.CONFLATED)
launch {
(1..3).forEach {
channel.send(it)
println("发送: $it")
}
channel.close()
}
launch {
for (i in channel) {
println("接收: $i")
}
}
println("代码结束")
}
}
//处理按钮点击事件
binding.button4.setOnClickListener {
runBlocking {
// 变化在这里
val channel = Channel<Int>(
capacity = 3,
onBufferOverflow = BufferOverflow.DROP_LATEST
)
launch {
(1..3).forEach {
channel.send(it)
println("发送: $it")
}
channel.send(4) // 被丢弃
println("发送: 4")
channel.send(5) // 被丢弃
println("发送: 5")
channel.close()
}
launch {
for (i in channel) {
println("接收: $i")
}
}
println("代码结束")
}
}
1, 在用完 channel 以后,如果我们不去主动关闭它的话,是会造成不必要的资源浪费的。
如果我们忘记调用“channel.close()”,程序将永远不会停下来
Kotlin 的 Channel,在默认情况下是“RENDEZVOUS”,也就代表了 Channel 的容量为 0。
此时发送和接收基本上是同步进行
2, capacity = Channel.Factory.UNLIMITED。
此处代码的运行顺序就跟之前不一样了。
对于发送方来说,由于 Channel 的容量是无限大的,所以发送方可以一直往管道当中塞入数据,
等数据都塞完以后,接收方才开始接收。这跟之前的交替执行是不一样的。
3,设置 capacity = CONFLATED 的时候,发送方也会一直发送数据,
但对于接收方来说,它永远只能接收到最后一条数据。
它相当于: capacity = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST
4, onBufferOverflow = BufferOverflow.DROP_LATEST
当 Channel 容量满了以后,之后再继续发送的内容,就会直接被丢弃。
第二个参数,onBufferOverflow,也就是指当我们指定了 capacity 的容量,等管道的容量满了时,Channel 的应对策略是怎么样的。
这里,它主要有三种做法:
SUSPEND,当管道的容量满了以后,如果发送方还要继续发送,我们就会挂起当前的 send() 方法。
由于它是一个挂起函数,所以我们可以以非阻塞的方式,将发送方的执行流程挂起,等管道中有了空闲位置以后再恢复。
DROP_OLDEST,顾名思义,就是丢弃最旧的那条数据,然后发送新的数据;
DROP_LATEST,丢弃最新的那条数据。
这里要注意,这个动作的含义是丢弃当前正准备发送的那条数据,而管道中的内容将维持不变。
二,运行结果:
第一个按钮点击:

第二个按钮点击:

第三个按钮点击:

第四个按钮点击:

浙公网安备 33010602011771号