Kotlin协程用Channel实现多路复用与selectClause

一、什么是多路复用

就是一个信道足够大,可以容纳多个信号,这时可以采用多路复用技术来加快效率。

音视频为例:


 

二、协程的多路复用

协程的多路复用的方法有很多,比如使用await、Channel、Flow都能进行多路复用,这里是进行多个复用的时候就会有先后顺序,协程会使用Select来进行挑选,谁先进来就谁先展示。

select 是 Kotlin 协程中的一个函数,用于同时等待多个挂起函数的结果,并在其中一个挂起函数完成时执行相应的操作


    @Test
    fun testselectChannel() = runBlocking {
        val channel = listOf(Channel<Int>(), Channel<Int>())
        //模拟两个发射到同一个通道Channel
        GlobalScope.launch {
            delay(1000)
            channel[0].send(200)
        }
        GlobalScope.launch {
            delay(500)
            channel[0].send(100)
        }
        val result = select<Int?> {
            channel.forEach{ channel ->
            channel.onReceive {it}
            }
        }
        println(result)
    }

 根据协程通道复用的概念,可知channel[0]发射的更快,将最先接收


 

三、selectclause

我们以SelectClause0为例。现在job1和job2没有返回值,select收集他们时,现在调用的job1.onJoin函数对应的参数就是SelectClause0

  @Test
    fun testselectChannel() = runBlocking {
        val channel = listOf(Channel<Int>(), Channel<Int>())
        //模拟两个发射到同一个通道Channel
        val job1 =  GlobalScope.launch {
            delay(1000)
            println("job1")
        }
        val job2 =  GlobalScope.launch {
            delay(500)
            println("job2")
        }
        select<Unit> {
            job1.onJoin{println("job1over")}
            job2.onJoin{println("job2over")}
        }

    }

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Imagine8877

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值