kotlin Channel的用法

channel相当于管道,协程间通信用。测试下:

Kotlin 复制代码
private fun tsetChannel() {
        lifecycleScope.launch {
            val channel = Channel<Int>()
            launch {
                for (i in 1..5) {
                    Log.d("zxzx", "开始发送数据:$i")
                    channel.send(i)
                }
                channel.close()
            }
            for (i in channel) {
                Log.d("zxzx", "接收到数据:$i")
            }
//           Log.d("zxzx", "receive: ${channel.receive()}") // 抛异常: Channel was closed
        }
        Log.d("zxzx", "东风不与周郎便,铜雀春深锁二乔。")
    }

运行,打印:

ok. 一个协程在发数据,另一个协程接受到数据。

再测试下:

Kotlin 复制代码
fun testProduceAndConsume() {
        GlobalScope.launch {
            val channel = Channel<Int>()

            val producer = GlobalScope.launch(Dispatchers.IO) {
                var i = 0
                while (true) {
                    if (channel.isClosedForReceive) {
                        Log.d("zxzx", "channel已关闭")
                        break
                    }
                    Log.d("zxzx", "生产者生产了:$i")
                    channel.send(i++)
                    delay(1000)
                }
            }

            val consumer = GlobalScope.launch {
                while (true) {
                    val element = channel.receive() // 没数据时会挂起等待数据
                    Log.d("zxzx", "消费者消费了: $element")
                    if (element == 10) {
                        channel.close()
                        break
                    }
                }
            }

            producer.join()
            consumer.join()
            Log.d("zxzx", "所有任务完成")
        }
    }

打印:

ok .

相关推荐
放学以后Nicetry17 小时前
Android SELinux 指南:从基本概念到实战修复
android
CCIE-Yasuo18 小时前
《永恒战士2-无双战神》无限金币版(提供apk下载)安卓Android逆向记录学习-Deepseek-AI辅助
android·java·学习·游戏
jzlhll12319 小时前
kotlin flow去重distinctUntilChanged vs distinctUntilChangedBy
android·开发语言·kotlin
渡我白衣19 小时前
【MySQL基础】(3):MySQL库与表的操作
android·数据库·人工智能·深度学习·神经网络·mysql·adb
huwuhang20 小时前
植物大战僵尸版本所有版本合集下载含杂交版 融合版 火影版 二战版 无双版 抽卡版 β版等等
android·游戏·电脑·游戏机
尤老师FPGA1 天前
petalinux修改设备树添加vdma生成linux系统
android·linux·运维
月山知了1 天前
linux kernel component子系统:基于rk3588 Android 14 kernel-6.1 display-subsystem代码分析
android·linux·运维
leo_messi941 天前
多线程(五) -- 并发工具(二) -- J.U.C并发包(八) -- CompletableFuture组合式异步编程
android·java·c语言
Deryck_德瑞克1 天前
【已解决】MySQL连接出错 1045 - Access denied for user ‘root‘@‘::1‘
android·mysql·adb
2501_915918411 天前
iOS性能测试工具 Instruments、Keymob的使用方法 不局限 FPS
android·ios·小程序·https·uni-app·iphone·webview