一、什么是多路复用
就是一个信道足够大,可以容纳多个信号,这时可以采用多路复用技术来加快效率。
音视频为例:
二、协程的多路复用
协程的多路复用的方法有很多,比如使用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")}
}
}