固定速率与固定延迟– RxJava常见问题解答

如果您使用的是纯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 SingleMaybe也可以工作,但是由于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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cpta 好像有漏洞

https://kwt.cpta.com.cn/转载于:https://www.cnblogs.com/heikeboys/p/7173543.html

通过Spring Boot使用MySQL JDBC驱动程序

在本文中&#xff0c;我将向您展示如何将MySQL数据库与Spring Boot应用程序连接。 本文使用的工具包括&#xff1a; Spring Boot 1.5.6版本 MySQL 5.7.X 马文 Java 8 Spring Data JPA 1 –项目结构 项目结构是典型的Maven结构。 2 –项目依赖性 请注意&#xff0c;父母…

如何开启O2优化

O2环境会使你的程序跑的特别快,然而大多数正式考试都不能开O2 然而平时做有些题强制开O2,会出现在本机运行正确,但是交上去RE的情况,这时你就要开O2了. 例如在本机运行时会有下标为-但可以运行,而O2你就会RE 那么如何开呢 类似这样 #include<bits/stdc.h> using namespac…

数颜色

此数颜色非彼数颜色, 彼者带修莫队,主席树,树套树,分块,权值线段树皆可A之 而此者带修莫队,树套树,分块皆不可A之 此者异常之简单也,而数据异常之傻逼也,卡我分块者也,卡我权值线段树者也 从11.00即开始卡常,然而不让我过 对于分块 使用register inline fread 展开 不写函数 二…

jax-ws cxf_走向REST:将Tomcat嵌入Spring和JAX-RS(Apache CXF)

jax-ws cxf这篇文章是上一篇文章的逻辑延续。 唯一的区别是我们将使用的容器&#xff1a;它将是我们的老兄Apache Tomcat而不是Jetty 。 令人惊讶的是&#xff0c;嵌入最新的Apache Tomcat 7非常容易&#xff0c;因此现在让我展示一下。 我不会重复完整的上一篇文章 &#xff0…

深入理解C指针第一章小结1

1.1 指针和内存&#xff0c;C程序在编译后&#xff0c;会以三种形式使用内存。 (1) 静态/全局内存&#xff1a;在程序开始时分配&#xff0c;程序结束才消失&#xff0c;所有函数都能访问全局变量&#xff0c;static静态变量的作用域局限在定义它们的函数内部 (2)自动内存&…

WSO2注册表安装简介

这篇文章基于有关注册表安装及其工作方式等常见问题。以下是人们提出的主要问题&#xff1a; 1&#xff09;。 安装如何工作&#xff1f; 2&#xff09;。 Config Registry和Governance Registry有什么区别&#xff1f; 3&#xff09;。 可以将H2以外的数据库用于本地注册表…

[Swift]LeetCode1147. 段式回文 | Longest Chunked Palindrome Decomposition

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号&#xff1a;山青咏芝&#xff08;shanqingyongzhi&#xff09;➤博客园地址&#xff1a;山青咏芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;➤GitHub地址&a…

运用PyTorch动手搭建一个共享单车预测器

本文摘自 《深度学习原理与PyTorch实战》 我们将从预测某地的共享单车数量这个实际问题出发&#xff0c;带领读者走进神经网络的殿堂&#xff0c;运用PyTorch动手搭建一个共享单车预测器&#xff0c;在实战过程中掌握神经元、神经网络、激活函数、机器学习等基本概念&#xff0…

jax-rs jax-ws_通过JAX-WS Provider在Web服务中利用MOXy

jax-rs jax-ws在以前的文章中&#xff0c;我演示了如何将EclipseLink JAXB&#xff08;MOXy&#xff09;直接集成到WebLogic&#xff08;从12.1.1开始&#xff09;和GlassFish&#xff08;从3.1.2开始&#xff09;的JAX-WS实现中 。 在本文中&#xff0c;我将演示如何通过使用J…

3个经常被忽略的APM关键功能

APM核心功能已不再足够。 市场领先的应用超越了以往&#xff0c;设置了其他人必须匹配的新标准。 每当任何针对消费者或企业的Web应用程序达到新的性能峰值时&#xff0c;都会为用户期望值设定基准。 这可能不公平或不合理&#xff0c;但这就是市场运作的方式。 当某人出于个…

NOIP模拟测试13「矩阵游戏·跳房子·优美序列」

矩阵游戏 考试时思路一度和正解一样&#xff0c;考试到最后还是打了80分思路&#xff0c;结果80分打炸了只得了40分暴力分 题解 算出来第一列的总值&#xff0c;每次通过加每两列之间的差值得出下一列的总值 算第一列我们只需要让当前点*行增倍的数量就行了 for(ll i1;i<n;i…

一次测试

$\leq$ $\in[x,y]$ 转载于:https://www.cnblogs.com/znsbc-13/p/11304153.html

java的xml面试题_Java程序员的10个XML面试问答

java的xml面试题XML面试问题在各种编程工作面试中非常受欢迎&#xff0c;包括针对Web开发人员的Java面试 。 XML是一项成熟的技术&#xff0c;通常用作从一个平台传输数据的标准。 XML面试问题包含来自各种XML技术&#xff08;例如XSLT&#xff09;的问题&#xff0c;该技术用于…

【chromium】 Chromium OS的oom机制

前一段时间&#xff0c;运行在Chromium OS上的一个相机应用经常会自己崩溃&#xff0c;进程戛然而止&#xff0c;测试过程中发现使用的内存以肉眼可见的内存增长&#xff0c;当增长到1G左右&#xff0c;应用窗口突然消失&#xff0c;虽然原因不明&#xff0c;但是能猜到个大概&…

了解java.nio.file.Path – 2

在本文的第1部分中&#xff0c;我们研究了java.nio.file.Path类中的大多数API。 在本文中&#xff0c;我们将介绍其余的API。 使用register&#xff08;&#xff09; 该API允许我们注册java.nio.file.WatchService接口的实现&#xff0c;该接口将侦听目录创建&#xff0c;修改…

欧几里德算法求最大公约数

在求两个数的最大公约数方法中&#xff0c; 辗转相除法是比较快的一种方法。 也就是著名的欧几里德方法。 View Code int Gcd(int a, int b){return b0?a:gcd(b, a%b); } View Code #include "iostream"#include "cstdio"#include "cstring"#…

__reduce__

一、__reduce__()介绍 当定义扩展类型时&#xff08;也就是使用Python的C语言API实现的类型&#xff09;&#xff0c;如果你想pickle它们&#xff0c;你必须告诉Python如何pickle它们。 __reduce__ 被定义之后&#xff0c;当对象被Pickle时就会被调用。它要么返回一个代表全局名…

camel.js_Camel 2.11 –具有URL重写功能的HTTP代理路由

camel.js在即将发布的Apache Camel 2.11版本中&#xff0c;我最近添加了对将自定义url重写实现插入基于HTTP的路由&#xff08;http&#xff0c;http4&#xff0c;jetty&#xff09;的支持。 当您使用骆驼代理/桥接HTTP路由时&#xff0c;这使人们可以控制url映射。 例如&…

问题 1044: [编程入门]三个字符串的排序

题目描述输入三个字符串&#xff0c;按由小到大的顺序输出输入3行字符串输出按照从小到大输出成3行样例输入cde afg abc样例输出abc afg cde分析&#xff1a;可以使用java自带方法compareTo()进行两两比较&#xff0c;首先输入三个字符串a,b,c用a和b比较&#xff0c;如果a的值比…