news 2026/9/1 4:25:08

Kotlin协程flow瞬时密集数据流去重debounce(1)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kotlin协程flow瞬时密集数据流去重debounce(1)

Kotlin协程flow瞬时密集数据流去重debounce(1)

这个功能很像Android里面利用Handler发送一些列delay的message,然后再handleMessage里面,根据收到的前后时延是否大于某个值,如果大于等于,则处理,否则丢弃。

import kotlinx.coroutines.async import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.delay import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.newFixedThreadPoolContext import kotlinx.coroutines.runBlocking const val mTimeOut = 300L val mChannel = Channel<Int>() val mThreadPool = newFixedThreadPoolContext(nThreads = 4, name = "my-thread") fun main() { val totalTaskSize = 20 runBlocking { //接收任务 async { mChannel.receiveAsFlow() .onEach { it -> //生产者 println("onEach $it ${Thread.currentThread().name}") }.flowOn(mThreadPool) .debounce(mTimeOut) .collect { it -> //消费者 recv(it) } } //源源不断的密集发送加载任务。 async(mThreadPool) { repeat(totalTaskSize) { it -> println("send $it ${Thread.currentThread().name}") mChannel.send(it) val t = (mTimeOut * Math.random()).toLong() + 100 println("send $it over, delay=$t ${Thread.currentThread().name}") delay(t) } } } } private fun recv(n: Int) { runBlocking { async(mThreadPool) { println("collect $n ${Thread.currentThread().name}") } } }

输出:

send 0 my-thread-1
onEach 0 my-thread-1
send 0 over, delay=276 my-thread-2
send 1 my-thread-3
send 1 over, delay=184 my-thread-3
onEach 1 my-thread-1
send 2 my-thread-4
send 2 over, delay=169 my-thread-4
onEach 2 my-thread-2
send 3 my-thread-3
send 3 over, delay=175 my-thread-3
onEach 3 my-thread-1
send 4 my-thread-4
send 4 over, delay=129 my-thread-4
onEach 4 my-thread-2
send 5 my-thread-2
send 5 over, delay=367 my-thread-2
onEach 5 my-thread-1
collect 5 my-thread-3
send 6 my-thread-2
send 6 over, delay=271 my-thread-2
onEach 6 my-thread-4
send 7 my-thread-1
send 7 over, delay=200 my-thread-1
onEach 7 my-thread-3
send 8 my-thread-2
send 8 over, delay=356 my-thread-2
onEach 8 my-thread-4
collect 8 my-thread-3
send 9 my-thread-2
send 9 over, delay=222 my-thread-2
onEach 9 my-thread-1
send 10 my-thread-4
send 10 over, delay=146 my-thread-4
onEach 10 my-thread-3
send 11 my-thread-2
send 11 over, delay=215 my-thread-2
onEach 11 my-thread-1
send 12 my-thread-2
send 12 over, delay=200 my-thread-2
onEach 12 my-thread-3
send 13 my-thread-1
send 13 over, delay=298 my-thread-1
onEach 13 my-thread-4
send 14 my-thread-2
send 14 over, delay=226 my-thread-2
onEach 14 my-thread-3
collect 13 my-thread-1
send 15 my-thread-2
send 15 over, delay=337 my-thread-2
onEach 15 my-thread-3
collect 15 my-thread-1
send 16 my-thread-2
send 16 over, delay=160 my-thread-2
onEach 16 my-thread-4
send 17 my-thread-2
send 17 over, delay=147 my-thread-2
onEach 17 my-thread-1
send 18 my-thread-3
send 18 over, delay=262 my-thread-3
onEach 18 my-thread-4
send 19 my-thread-2
send 19 over, delay=163 my-thread-2
onEach 19 my-thread-1
collect 19 my-thread-4

相关:

https://blog.csdn.net/zhangphil/article/details/132515686

https://blog.csdn.net/zhangphil/article/details/132525124

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 3:46:46

抓住AI教育变革窗口期:教育 Agent 实时内容更新技术已进入稀缺阶段

第一章&#xff1a;教育 Agent 内容更新的变革意义随着人工智能技术在教育领域的深度渗透&#xff0c;教育 Agent 正逐步从被动响应工具演变为具备主动学习与动态内容更新能力的智能体。这种转变不仅提升了知识传递的时效性&#xff0c;更重构了教与学之间的互动范式。动态知识…

作者头像 李华
网站建设 2026/8/31 18:03:32

教育 Agent 如何精准预测学生成绩?:基于5大关键数据模型的深度解析

第一章&#xff1a;教育 Agent 的学情分析 在智能教育系统中&#xff0c;教育 Agent 扮演着个性化学习引导者的核心角色。其关键能力之一是精准的学情分析&#xff0c;即通过多维度数据理解学生的学习状态、知识掌握程度和认知行为模式&#xff0c;从而动态调整教学策略。 学情…

作者头像 李华
网站建设 2026/8/31 14:09:32

vue和springboot框架开发的小程序 思政考核管理系统_cv4lm54k

文章目录具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 同行可拿货,招校园代理 vueSpringboot思政考核管理系统_才Vlm5k 框架开发的…

作者头像 李华
网站建设 2026/8/31 12:30:19

MySQL 运算符

MySQL 运算符 MySQL 是一种广泛使用的开源关系型数据库管理系统,它提供了丰富的运算符来处理数据。运算符是数据库查询语言(SQL)的核心组成部分,用于在查询中执行各种计算和比较操作。本文将详细介绍 MySQL 中常用的运算符,包括算术运算符、比较运算符、逻辑运算符等。 …

作者头像 李华
网站建设 2026/8/31 18:17:23

不得不说,小孩子近视防控一定要趁早!

作为长期关注儿童视力健康的博主&#xff0c;我见过太多家长在孩子确诊近视后追悔莫及。近年来&#xff0c;儿童青少年近视率持续攀升&#xff0c;低龄化趋势愈发明显&#xff0c;不少孩子在小学阶段就戴上了厚重的眼镜。事实上&#xff0c;近视防控的核心逻辑从来不是“等到视…

作者头像 李华
网站建设 2026/8/31 8:05:30

Docker实战:利用commit命令构建镜像

文章目录1. 实战概述2. 实战步骤2.1 下载Nginx镜像2.2 创建并启动Nginx容器2.3 修改Nginx主页文件2.3.1 备份主页文件2.3.2 修改主页内容2.4 启动Nginx服务2.5 访问Nginx主页2.6 停止Nginx服务并退出容器2.7 利用commit命令构建新镜像2.8 利用新镜像生成容器并测试3. 实战总结…

作者头像 李华