Kotlin 协程协程中的多路复用技术 ① ( 多路复用技术 | await 协程多路复用 | Channel 通道多路复用 )
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin 协程协程中的多路复用技术 ① ( 多路复用技术 | await 协程多路复用 | Channel 通道多路复用 )相关的知识,希望对你有一定的参考价值。
文章目录
一、多路复用技术
在信号传输时 , 通信信道 的 带宽 远大于 传输单一信号的需求 ,
在同一信道中可以同时传递 多路 信号 ,
该技术成为 " 多路复用技术 " ;
二、await 协程多路复用
在 协程 中 , 可以通过 复用 多个 await 的方式 , 实现 多路复用 ;
使用场景 :
使用 不同的协程 , 分别从 网络 和 本地 获取数据 ,
协程 A 从网络获取数据 ,
协程 B 从本地获取数据 ,
哪个协程 先返回 , 则 优先使用该协程返回的数据 ;
在 select 代码块中 , 同时 调用 Job.onAwait 函数 , 同时执行两个协程, 哪个先执行完毕, 就取哪个协程的执行结果 ;
// 同时执行两个协程, 哪个先执行完毕, 就取哪个协程的执行结果
val data = select<String>
localJob.onAwaitit
remoteJob.onAwaitit
代码示例 :
package kim.hsl.coroutine
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.*
import kotlinx.coroutines.selects.select
class MainActivity : AppCompatActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
runBlocking
GlobalScope.launch
val localJob = GlobalScope.getDataFromLocal()
val remoteJob = GlobalScope.getDataFromNetwork()
// 同时执行两个协程, 哪个先执行完毕, 就取哪个协程的执行结果
val data = select<String>
localJob.onAwaitit
remoteJob.onAwaitit
println("最终数据为 $data")
// 将 getDataFromLocal 函数定义为 GlobalScope 的扩展函数
fun GlobalScope.getDataFromLocal() = async(Dispatchers.IO)
delay(500)
println("获取本地数据")
"本地数据"
// 将 getDataFromNetwork 函数定义为 GlobalScope 的扩展函数
fun GlobalScope.getDataFromNetwork() = async(Dispatchers.IO)
delay(1000)
println("获取网络数据")
"网络数据"
执行结果 :
22:03:52.684 System.out kim.hsl.coroutine I 获取本地数据
22:03:52.686 System.out kim.hsl.coroutine I 最终数据为 本地数据
22:03:53.176 System.out kim.hsl.coroutine I 获取网络数据
三、Channel 通道多路复用
Channel 通道多路复用 , 就是 多个 Channel 通道同时 传递消息 , 取传递消息最快的 Channel 通道中的信息 ;
代码示例 :
package kim.hsl.coroutine
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.selects.select
class MainActivity : AppCompatActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
runBlocking
val channel0 = Channel<Int>()
val channel1 = Channel<Int>()
GlobalScope.launch
delay(500)
channel0.send(500)
println("channel0 通道发送 500")
GlobalScope.launch
delay(1000)
channel1.send(1000)
println("channel1 通道发送 1000")
val num = select<Int>
channel0.onReceive it
channel1.onReceive it
println("最终结果为 $num")
执行结果 :
22:16:39.609 System.out kim.hsl.coroutine I channel0 通道发送 500
22:16:39.611 System.out kim.hsl.coroutine I 最终结果为 500
以上是关于Kotlin 协程协程中的多路复用技术 ① ( 多路复用技术 | await 协程多路复用 | Channel 通道多路复用 )的主要内容,如果未能解决你的问题,请参考以下文章
深入理解Kotlin协程协程中的Channel和Flow & 协程中的线程安全问题
Kotlin 协程协程异常处理 ② ( SupervisorJob 协程 | supervisorScope 协程作用域构建器函数 )
Kotlin 协程协程异常处理 ② ( SupervisorJob 协程 | supervisorScope 协程作用域构建器函数 )
Kotlin 协程协程的挂起和恢复 ② ( 协程挂起 和 线程阻塞 对比 )
Kotlin 协程协程的挂起和恢复 ② ( 协程挂起 和 线程阻塞 对比 )
Kotlin 协程协程异常处理 ④ ( Android 协程中出现异常导致应用崩溃 | Android 协程中使用协程异常处理器捕获异常 | Android 全局异常处理器 )