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,丢弃最新的那条数据。
                       这里要注意,这个动作的含义是丢弃当前正准备发送的那条数据,而管道中的内容将维持不变。

二,运行结果:

第一个按钮点击:

第二个按钮点击:

第三个按钮点击:

第四个按钮点击:

posted @ 2025-07-26 11:39  刘宏缔的架构森林  阅读(25)  评论(0)    收藏  举报