openwrt固定速率_固定速率与固定延迟– RxJava常见问题解答
openwrt固定速率
如果您使用的是纯Java,从版本5开始,我们有一个方便的调度程序类,该类允许以固定速率或固定延迟运行任务:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(10);
基本上,它支持两种类型的操作:
scheduler.scheduleAtFixedRate(() -> doStuff(), 2, 1, SECONDS);
scheduler.scheduleWithFixedDelay(() -> doStuff(), 2, 1, SECONDS);
scheduleAtFixedRate()
将确保每秒精确调用doStuff()
,初始延迟为2秒。 当然,垃圾回收,上下文切换等仍然会影响精度。 scheduleWithFixedDelay()
看起来很相似,但是它考虑了doStuff()
处理时间。 例如,如果doStuff()
运行doStuff()
毫秒,则固定速率将仅等待800毫秒,直到下一次重试。 另一方面, scheduleWithFixedDelay()
总是在重试之间等待相同的时间(在本例中为1秒)。 在不同情况下,两种行为当然都是可取的。 仅记住,当doStuff()
的速度慢于1秒时, scheduleAtFixedRate()
不会保留所需的频率。 即使我们的ScheduledExecutorService
有10个线程, doStuff()
也绝不会被同时调用并且不会与之前的执行重叠。 因此,在这种情况下,速率实际上将小于配置的速率。
<h1”> RxJava中的计划
使用interval()
运算符,使用RxJava模拟scheduleAtFixedRate()
非常简单。 有几点警告:
Flowable.interval(2, 1, SECONDS).subscribe(i -> doStuff());
如果doStuff()
的速度慢于1秒,则会发生不良情况。 首先,我们使用Schedulers.computation()
线程池,它是从interval()
运算符继承的默认池。 这是一个坏主意,该线程池仅应用于CPU密集型任务,并在整个RxJava之间共享。 一个更好的主意是使用您自己的调度程序(或至少使用io()
):
Flowable.interval(2, 1, SECONDS).observeOn(Schedulers.io()).subscribe(i -> doStuff());
observeOn()
从开关computation()
由用于调度interval()
到io()
调度器。 由于subscribe()
方法永远不会被设计并发调用, doStuff()
永远不会并发调用,就像scheduleAtFixedRate()
但是, interval()
运算符非常努力地保持恒定的频率。 这意味着如果过一会儿doStuff()
的速度慢于1秒,我们应该期望MissingBackpressureException
…RxJava基本上告诉我们订户速度太慢,但是interval()
(根据设计)不会变慢。 如果您可以容忍(甚至期望) doStuff()
并发执行重叠,则修复起来非常简单。 首先,必须使用非阻塞Completable
包装阻塞的doStuff()
。 从技术上讲, Flowable
Single
或Maybe
也可以工作,但是由于doStuff()
为void
,所以Completable
听起来不错:
import io.reactivex.Completable;
import io.reactivex.schedulers.Schedulers;Completable doStuffAsync() {return Completable.fromRunnable(this::doStuff).subscribeOn(Schedulers.io()).doOnError(e -> log.error("Stuff failed", e)).onErrorComplete();
}
捕获并吞下异常很重要,否则单个错误将导致整个interval()
中断。 doOnError()
允许记录日志,但它将异常通过下游传递。 另一方面, doOnComplete()
仅吞下异常。 现在,我们可以在每个间隔事件中简单地运行此操作
Flowable.interval(2, 1, SECONDS).flatMapCompletable(i -> doStuffAsync()).subscribe();
如果您不subscribe()
循环将永远不会开始-但这是RxJava101。请注意,如果doStuffAsync()
花费一秒钟以上的时间来完成,我们将得到重叠的并发执行。 这没什么不对,您只需要意识到这一点。 但是,如果您真正需要的是固定延迟怎么办?
修复了RxJava中的延迟
在某些情况下,您需要固定的延迟:任务不应重叠,并且在两次执行之间我们应保持喘息的时间。 不管周期性任务有多慢,都应始终保持恒定的时间暂停。 interval()
运算符不适合实现此要求。 但是,事实证明,RxJava中的解决方案非常简单。 想一想:您需要睡一会儿,运行一些任务,然后在完成此任务后重复。 让我再说一遍:
- 睡一会儿(有一些
timer()
) - 运行一些任务,等待它
complete()
repeat()
而已!
Flowable.timer(1, SECONDS).flatMapCompletable(i -> doStuffAsync()).repeat().subscribe();
timer()
运算符在一秒钟后发出一个事件( Long
类型的0
)。 我们使用此事件来触发doStuffAsync()
。 当我们的东西做,全码流完成-但我们想重复! 好吧, repeat()
运算符就是这样做的:当它从上游收到完成通知时,它会重新订阅。 重新订阅基本上意味着:再等待1秒钟, doStuffAsync()
–依此类推。
翻译自: https://www.javacodegeeks.com/2017/09/fixed-rate-vs-fixed-delay-rxjava-faq.html
openwrt固定速率
openwrt固定速率_固定速率与固定延迟– RxJava常见问题解答相关推荐
- 固定速率与固定延迟– RxJava常见问题解答
如果您使用的是纯Java,从版本5开始,我们有一个方便的调度程序类,该类允许以固定速率或固定延迟运行任务: import java.util.concurrent.Executors; import ...
- 吸顶灯怎么固定天花板_如何将物品固定在天花板上同时不破坏天花板和墙面
怎么把日光灯固定在石灰天花板上 用电锤或冲击钻钻.电锤和冲击钻都有活塞运动功能,都可以在砼构筑物上开孔,但电锤比冲击钻的功率大,根据孔的大小.深度决定用什么.孔径在25mm以下时用冲击钻,优点是对孔周 ...
- 渴望 英语_渴望订阅– RxJava常见问题解答
渴望 英语 在教学和指导RxJava以及撰写本书之后 ,我注意到某些领域特别有问题. 我决定发布一些简短的提示,以解决最常见的陷阱. 这是第一部分. Observable和Flowable本质上是惰性 ...
- 技术停滞_检测和测试停滞的流– RxJava常见问题解答
技术停滞 假设您有一个流以不可预测的频率发布事件. 有时您可以预期每秒会有数十条消息,但是偶尔几秒钟都看不到任何事件. 如果您的流是通过Web套接字,SSE或任何其他网络协议传输的,则可能会出现问题. ...
- flowable背压 取消_使用Flowable.generate()生成可感知背压的流– RxJava常见问题解答...
flowable背压 取消 RxJava缺少创建无限自然数流的工厂. 这样的流很有用,例如,当您想通过压缩两个事件的顺序来为可能的无限事件流分配唯一的序列号时: Flowable<Long> ...
- rxjava 背压_背压加载文件– RxJava常见问题解答
rxjava 背压 事实证明,将文件作为流进行处理非常有效且方便. 许多人似乎忘记了,自Java 8(3年以上!)以来,我们可以很容易地将任何文件变成一行代码: String filePath = & ...
- 金蝶kis商贸采购单商品代码_金蝶KIS商贸高级版操作常见问题解答
金蝶KIS商贸高级版操作常见问题解答 金蝶KIS商贸高级版操作常见问题有哪些你知道吗?你知道如何解决金蝶KIS商贸高级版操作常见问题吗?下面是yjbys小编为大家带来的金蝶KIS商贸高级版操作常见问题 ...
- 装完金蝶电脑无限重启_金蝶财务软件快捷键大全及常见问题解答,提高工作效率!...
金蝶是会计人员经常使用到的财务软件之一,但也不是每个财务人员都能用的熟练. 这个软件吧,用好了笑看别人加班,用不好则被别人笑看加班. 而用好与用不好的差别往往就在你知不知道快捷键上. 今天咱们就来分享 ...
- 底部固定菜单_捡起一只妲己团团,附送一个同校固定队友!还有这种好事?
等你点亮这颗星 指引 期待大大们点亮小星星 不会错过次世代情报和最全福利! 固定布局 工具 ...
最新文章
- 终端安全工具 gartner 排名
- Kafka 0.10.0文档翻译二
- 农产品谋定创意种植-农业大健康·焦裕良:新概念新创意
- Elasticsearch —— bulk批量导入数据
- 简述mysql完全备份过程_【SQL】MySQL之使用mysqldump全备份及恢复过程详解_MySQL
- 课时5 企业Web服务器现场抓鸡案例分享
- 进销存erp系统价格
- Rust:Match语句详解
- 【我是老中医】codeblocks无法编译的问题解决方法
- 解决REFERENCEERROR: primordials is not defined问题
- linux逆向分析之ELF文件详解
- 圣诞树代码(python)
- 立刷提现显示服务器繁忙,为什么我的网页显示服务器繁忙,求大神教破除方法...
- python实现视频剪辑_MoviePy常用剪辑类及Python视频剪辑自动化
- ArcGIS 坡度分析及坡度集中在80-90间的原因
- “柏域信息”再获“国家高新技术企业”称号
- 从CSDN博客下载的图片如何无损去水印
- 【latex】3 会议期刊论文模板的使用方法(包括矢量图片处理方法)
- vue小实验——小米商城购物车,合计、结算、数量加减
- Java判断gps点是否在中国,如何判断一个指定的位置点坐标(GPS上的经纬度)是否落在一个多边形区域内?...