前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Kotlin 协程】协程中的多路复用技术 ① ( 多路复用技术 | await 协程多路复用 | Channel 通道多路复用 )

【Kotlin 协程】协程中的多路复用技术 ① ( 多路复用技术 | await 协程多路复用 | Channel 通道多路复用 )

作者头像
韩曙亮
发布2023-03-30 18:33:25
8020
发布2023-03-30 18:33:25
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、多路复用技术


在信号传输时 , 通信信道 的 带宽 远大于 传输单一信号的需求 ,

在同一信道中可以同时传递 多路 信号 ,

该技术成为 " 多路复用技术 " ;

二、await 协程多路复用


在 协程 中 , 可以通过 复用 多个 await 的方式 , 实现 多路复用 ;

使用场景 :

使用 不同的协程 , 分别从 网络 和 本地 获取数据 ,

协程 A 从网络获取数据 ,

协程 B 从本地获取数据 ,

哪个协程 先返回 , 则 优先使用该协程返回的数据 ;

在 select 代码块中 , 同时 调用 Job.onAwait 函数 , 同时执行两个协程, 哪个先执行完毕, 就取哪个协程的执行结果 ;

代码语言:javascript
复制
                // 同时执行两个协程, 哪个先执行完毕, 就取哪个协程的执行结果
                val data = select<String> {
                    localJob.onAwait{it}
                    remoteJob.onAwait{it}
                }

代码示例 :

代码语言:javascript
复制
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.onAwait{it}
                    remoteJob.onAwait{it}
                }

                println("最终数据为 $data")
            }
        }
    }

    // 将 getDataFromLocal 函数定义为 GlobalScope 的扩展函数
    fun GlobalScope.getDataFromLocal() = async(Dispatchers.IO) {
        delay(500)
        println("获取本地数据")
        "本地数据"
    }

    // 将 getDataFromNetwork 函数定义为 GlobalScope 的扩展函数
    fun GlobalScope.getDataFromNetwork() = async(Dispatchers.IO) {
        delay(1000)
        println("获取网络数据")
        "网络数据"
    }
}

执行结果 :

代码语言:javascript
复制
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 通道中的信息 ;

代码示例 :

代码语言:javascript
复制
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")
        }
    }
}

执行结果 :

代码语言:javascript
复制
22:16:39.609 System.out   kim.hsl.coroutine     I  channel0 通道发送 500
22:16:39.611 System.out   kim.hsl.coroutine     I  最终结果为 500
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、多路复用技术
  • 二、await 协程多路复用
  • 三、Channel 通道多路复用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档