Android面试题之kotlin热流和channel

embedded/2024/10/15 16:02:10/

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点

于冷流不同,在垃圾回收之前,flow里的值都是存在内存之中,并且处于活跃状态

StateFlow

StateFlow是一个状态容器式可观察数据流,可以向其收集器发出当前状态更新和新状态更新。还可通过其value属性读取当前的状态值

  • 和livedata比较像,有新数据可以通知collect的一方
  • 同时又具有flow的所有特点,比如可以挂起,切换线程
SharedFlow

SharedFlow会向其中收集值得所有使用方发出数据

  • 也就是一对多的关系,可以有多个collector
  • 同时又具有flow的所有特点,比如可以挂起,切换线程
  • 和上面的StateFlow不同的是,这个不能主动通知collect方,需要不断emit元素,也就是利用了flow的功能
channel
定义概念
  • channel实际上是一个并发安全的队列,它可以用来连接协程,实现不同协程的通信
  • channel实际上就是一个队列,队列中一定存在缓冲区,那么这个缓冲区一旦满了,并且也一直没有人调用receive并取走函数,send就需要挂起。
  • 默认缓冲区大小是0
val channel = Channel<Int>()@Test
fun `test channel` ()= runBlocking<Unit>{val producer = GlobalScope.launch { var i = 0;while (true){delay(1000)channel.send(++i)println("send $i")}}val consumer = GlobalScope.launch { while (true){val element = channel.receive()println("receive $element")}}joinAll(producer, consumer)
}
  • 在读取channel时可以直接获取一个channel的iterator迭代器
val iterator = channel.iterator()
while (iterator.hasNext()){val element = iterator.next()
}//也可以这样
for (element in channel){}
produce与actor
  • 构造生产者和消费者的便捷方法
  • 可以通过produce方法启动一个生产者协程,并返回一个ReceiveChannel,其他协程就可以用这个Channel来接受数据。反过来,我们可以用actor启动一个消费者协程。
val receiveChannel: ReceiveChannel<Int> = GlobalScope.produce {repeat(100){delay(1000)send(it)}
}
val consumer = GlobalScope.launch {for (i in receiveChannel){println("receive $i")}
}val sendChannel:SendChannel<Int> = GlobalScope.actor {while (true){val element = receive()println(element)}
}
val producer = GlobalScope.launch {for (i in 1..3){sendChannel.send(i)}
}
channel的关闭
  • produce与actor返回的channel都会随着对应的协程执行完毕而关闭
  • 对于一个channel,如果我们调用了它的close方法,它会立即停止接受新元素,也就是说这时它的isClosedForSend会立即返回true。而由于channel缓冲区的存在,这时候可能还有元素没有被处理完,因此要等所有的元素都被读取之后isClosedForReceive才会返回true
  • channel的生命周期最好由主导方来维护,建议由主导的一方实现关闭
BroadcastChannel

发送端和接收端在Channel中存在一对多的情形,从数据处理本身来说,虽然有多个接收端,但是同一个元素只会被一个接收端读到。广播则不然,多个接收端不存在互斥行为


欢迎关注我的公众号查看更多精彩文章!
AntDream


http://www.ppmy.cn/embedded/39985.html

相关文章

Django性能之道:缓存应用与优化实战

title: Django性能之道&#xff1a;缓存应用与优化实战 date: 2024/5/11 18:34:22 updated: 2024/5/11 18:34:22 categories: 后端开发 tags: 缓存系统Redis优点Memcached优缺点Django缓存数据库优化性能监控安全实践 引言 在当今的互联网时代&#xff0c;用户对网站和应用…

Linux(Ubuntu24.04) 安装 MinIO

本文所使用的 Ubuntu 系统版本是 Ubuntu 24.04 ! # 1、下载 MinIO wget https://dl.min.io/server/minio/release/linux-amd64/minio# 2、添加可执行权限 chmod x minio# 3、导出环境变量&#xff0c;用于设置账号密码&#xff0c;我设置的账号和密码都是 minioadmin export MI…

每周日发系统规划与管理师伴读脑图,今天是第4章

从第4章开始&#xff0c;系统规划与管理师的学习就正式步入了主题&#xff0c;考虑到我过去中断了2周&#xff0c;想必你的第4章教程已经看完了吧&#xff1f;

MySql 事务

事务ACID特性 事务&#xff1a;一组操作要么全部成功&#xff0c;要么全部失败&#xff0c;目的是为了保证数据的最终一致性。 原子性(Atomicity)&#xff1a;当前的事务要么同时成功&#xff0c;要么同时失败。原子性由undo log日志来实现。&#xff08;mysql undo log日志会…

[单机]成吉思汗3_GM工具_VM虚拟机

稀有端游成吉思汗1,2,3单机版虚拟机一键端完整版 本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#x…

java spring 11 推断构造方法 createBeanInstance

1.doCreateBean方法&#xff1a;这一部分 BeanWrapper instanceWrapper null;if (mbd.isSingleton()) {// 有可能在本Bean创建之前&#xff0c;就有其他Bean把当前Bean给创建出来了&#xff08;比如依赖注入过程中&#xff09;instanceWrapper this.factoryBeanInstanceCache…

https://是怎么实现的?

默认的网站建设好后都是http访问模式&#xff0c;这种模式对于纯内容类型的网站来说&#xff0c;没有什么问题&#xff0c;但如果受到中间网络劫持会让网站轻易的跳转钓鱼网站&#xff0c;为避免这种情况下发生&#xff0c;所以传统的网站改为https协议&#xff0c;这种协议自己…

DDD架构理论详解

文章目录 一、概念入门1. 概念简介2. DDD的核心理念3. 范式4. 模型5. 框架6. 方法论7. 软件设计的主要活动 二、DDD核心理论1. Domain领域层都包含什么&#xff1f;2. 聚合、实体和值对象3. 仓储&#xff0c;封装持久化数据4. 适配&#xff08;端口&#xff09;&#xff0c;调用…