Java调度执行器的准确性

2024-02-23

我在使用 Java 调度执行器时遇到了一个奇怪的情况,我想知道我遇到的情况是否正常。

我需要安排以 5 秒的预定义速率执行的任务。预计这些任务的执行时间有时会超过 5 秒,但当运行它们的时间低于 5 秒时,备份的任务列表应快速连续运行以赶上。运行任务时,了解原始计划执行时间是很重要的(想想scheduledExecutionTime() in java.util.TimerTask)。最后,我需要跟踪计划时间和实际时间之间的差异,以确定时间表何时“偏离”以及偏离了多少。

到目前为止,我已经使用 Java 执行器实现了所有这些,下面的类说明了总体思路:

public class ExecutorTest {
    public static final long PERIOD = 5000;

    public static void main(String[] args) {
        Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(
                new Command(), 0, PERIOD, TimeUnit.MILLISECONDS);
    }

    private static final class Command implements Runnable {
        long timestamp = 0;

        public void run() {
            long now = System.currentTimeMillis();

            if (timestamp == 0) {
                timestamp = now;
            }

            // Drift is the difference between scheduled time and execution time
            long drift = now - timestamp;

            String format = "Ran at %1$tF %<tT,%<tL; drift: %2$dms";
            System.out.println(String.format(format, now, drift));

            timestamp += PERIOD;
        }
    }
}

运行上面列出的代码显示漂移(理想情况下应尽可能接近 0)波动多达几秒,其结果是任务提前或延迟执行。我根据运行大约 150 分钟的结果创建了一个图表:

所以我的第一个问题是这是否正常。我的环境由 32 位 Windows XP 和 Java 1.5 update 21 组成(尽管 Java 6 update 22 产生类似的结果)。

第二个问题是是否有一种简单的方法可以减少漂移量。如果我使用一个简单的java.util.Timer甚至只是Thread.sleep(),漂移是不存在的。

最后,使用计划执行器时是否有更好的方法来跟踪计划执行时间?


计划执行程序服务使用 System.nanoTime,它的漂移不如 currentTimeMillis 那么多。除非您运行的是具有多个 CPU 插槽的 XP 系统。 XP 中存在一个错误,其中操作系统调用 System.nanoTime() 使用的套接字之间不一致,因此当线程切换其正在运行的套接字时,您可以期望看到这种跳跃。 (这在 Vista/7 上不是问题)

在具有一个套接字的 Linux 系统上,您的程序报告 0 - 3 毫秒的漂移。

试试这个程序。

public static void main(String... args) throws Exception {
    long start = System.nanoTime();
    long time = start;
    while(time < start + 3e10) {
        long now = System.nanoTime();
        if (now < time || now > time + 50000) {
            System.out.println(now - time);
            now = System.nanoTime();
        }
        time = now;
    }
}

在 i7 系统上,我看到大约 10 次最多 2 毫秒的跳跃。如果我使用这台机器,我会看到更多。我预计你可能会看到大量的消极和积极的时机。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java调度执行器的准确性 的相关文章

  • Java将字符串解析为double

    如何解析字符串中的这个 Double 00034800 变成 Double 值 最后两位数字实际上是小数点 所以我正在寻找的结果是348 00 是否有这样的格式可以与十进制格式一起使用 Well String s 00034800 doub
  • “源兼容性”和“目标兼容性”有什么区别?

    之间有什么关系 区别sourceCompatibility and targetCompatibility 当它们设置为不同的值时会发生什么 根据工具链和兼容性 https docs gradle org current userguide
  • 在Windows Server 2003下如何在本地系统帐户下运行jvisualvm.exe?

    我在带有 Java 1 6 u 20 的 Windows Server 2003 下将 GlassFish 3 0 1 作为 Windows 服务运行 总体上我很满意 我希望能够在这个 JVM 上使用 VisualVM 并使用无法在 Tom
  • java程序有多少种结束方式?

    我知道使用 System exit 0 可以结束一个java程序 例如 如果我有一个JFrame窗口 它会关闭并结束程序 但我想知道还有多少其他方法 可以关闭它并结束程序 包括发生错误时 程序会被关闭 JFrame也会被关闭吗 添加到其他答
  • 非易失性领域的出版与阅读

    public class Factory private Singleton instance public Singleton getInstance Singleton res instance if res null synchron
  • 使用 Exec Maven 插件分叉 Java,而不使用“exec”目标

    来自文档 https www mojohaus org exec maven plugin exec exec在单独的进程中执行程序和Java程序 exec java在同一虚拟机中执行 Java 程序 我想 fork 一个 java 程序
  • 查看Java Agent修改的Java类的源代码

    我需要了解 Java 代理如何修改我的初始类 以便我能够理解代码的作用 build gradle configurations jar archiveName agent2 jar jar manifest attributes Prema
  • 有人用过 ServiceLoader 和 Guice 一起使用吗?

    我一直想通过我们的应用程序 构建系统进行更大规模的尝试 但更高的优先级不断将其推到次要地位 这似乎是加载 Guice 模块的好方法 并且避免了关于 硬编码配置 的常见抱怨 单个配置属性很少会自行更改 但您几乎总是会有一组配置文件 通常用于不
  • 自定义列表字段点击事件

    我正在编写一个应用程序 其中我创建了用于显示列表视图的自定义列表字段 我的 CustomListField 包含连续的一个图像和文本 我正在通过单击列表字段行获取字段更改侦听器 但我也想将字段更改侦听器放在图像上 谁能告诉我我该怎么做 这是
  • JAXB - 忽略元素

    有什么方法可以忽略 Jaxb 解析中的元素吗 我有一个很大的 XML 文件 如果我可以忽略其中一个大而复杂的元素 那么它的解析速度可能会快很多 如果它根本无法验证元素内容并解析文档的其余部分 即使该元素不正确 那就更好了 例如 这应该只生成
  • Android 认为我没有关闭数据库!为什么?

    我有一个 SQLiteDatabase 数据成员 我在 onCreate 中初始化它 并在 onPause onStop 和 onDestroy 中调用 close 它在 onResume 中重新初始化 它似乎运行得很好 但当我查看调试器时
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • 使用 Proguard 通过 Dropbox.com 库混淆 Android 应用程序

    我刚刚创建了一个需要 Dropbox com API 库的 Android 应用程序 我现在尝试在 发布 模式下构建应用程序 并希望在代码上运行混淆器以对其进行混淆 但是 每当我尝试运行 Proguard 时 都会收到以下错误 Progua
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • titledBorder 标题中的图标

    您好 是否可以在 titledBorder 的标题中放置一个图标 例如以下代码 import java awt GridLayout import javax swing JFrame import javax swing JLabel i
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • 我所有的 java 应用程序现在都会抛出 java.awt.headlessException

    所以几天前我有几个工作Java应用程序使用Swing图书馆 JFrame尤其 他们都工作得很好 现在他们都抛出了这个异常 java awt headlessexception 我不知道是什么改变了也许我的Java版本不小心更新了 谢谢你尽你
  • 在 Java 中通过 D-Bus MPRIS 访问 Clementine 实例

    我使用 Clementine 作为音乐播放器 它可以通过 D Bus 命令进行控制 在命令行上 使用 qdbus 我可以 Start Stop 暂停播放器 强制它跳过播放列表中的歌曲 检查播放列表的长度 检查播放列表中当前播放的曲目及其元数
  • Java 中清除嵌套 Map 的好方法

    public class MyCache AbstractMap
  • 什么是 Java2D 处理程序线程?

    我创建了一个使用 Hibernate 的示例 java 应用程序 当我进行线程转储时 我观察到一个名为 Java2D Disposer 的奇怪线程 有人能告诉我该线程的功能吗 AWT 系统中的某些实体需要最终确定以释放资源 最突出的例子是j

随机推荐

  • C++ STL 容器 ::clear ::swap

    清理 大型 STL 容器的最快方法是什么 在我的应用程序中 我需要处理大尺寸std map 例如 10000 个元素 我测试了以下3种方法来清除std map 每次需要时创建一个新容器 Calling map clear method Ca
  • 使 optgroup 标签在下拉列表中选择

    我计划为主要车型 瑞典汽车 提供一个简短的描述页面 我还想表明沃尔沃和萨博在下拉列表中位于瑞典汽车下方 然后 当我单击沃尔沃时 它应该导航到沃尔沃描述页面 如何显示最初选择的 optgroup 标签 谢谢
  • Windows:如何使用带路径的主机文件?

    这有效 127 0 0 1 www somesite com 但不是这个 127 0 0 1 somepath www www mysite com 我究竟做错了什么 是否可以绘制这样的完整路径 如果没有 完成我想做的事情的最简单方法是什么
  • 为 Android 部署 Phonegap / Cordova 应用程序?

    我正在 Android 上测试 Phonegap Cordova 3 0 应用程序 从 2 x 版本开始 Cordova 严重依赖命令行终端 我已经完成了所有设置 可以构建应用程序了 但有两件事困扰着我 首先 一个Android项目有两个w
  • 敲除剑道问题通过计算的可观察值进行绑定

    我尝试使用knockout kendo js 在knockout forEach 模板中声明kendo dropdownlist 控件 以便当新项目添加到knockout 可观察数组时 新的kendo dropdownlist 会在UI 中
  • C++ 中的函数与变量声明

    这段代码的工作原理 std ifstream f mapFilename c str std string s std string std istreambuf iterator
  • sf 对象的大小图例不会显示正确的符号

    有谁知道为什么传说size审美的BIR74不会显示点大小而是矩形 如果答案是肯定的 我该如何解决这个问题 可重现的例子 library sf devtools install github tidyverse ggplot2 library
  • 为什么这个不能是本地的?

    这是我正在运行的设置的虚拟变体 Launcher函数好像没有看到GetLevel 至少可以看到第一个印刷品 但看不到第二个印刷品 所以该函数永远不会启动 这是因为代码出现在代码中启动它的位置之后 而在启动器执行时它还不存在吗 当我删除本地标
  • FluentValidation 检查子集合中的重复实体

    我有一个MainEntity类 它有一个集合SubEntity 目前的验证情况如下 public class MainEntityValidator AbstractValidator
  • git-tf 无法找到所需的 JAR

    我正在尝试在我的 Windows 工作站上设置 git tf 桥 当我尝试执行其中一个命令时 它总是显示消息 无法找到所需的 JAR C my path to git tf lib com microsoft gittf client cl
  • 如何从 Gemfile.lock 文件安装 gem?

    我正在尝试运行一个从 Github 上取下的应用程序 我跑了bundle install从以下位置安装所需的 gemGemfile 然而 当运行应用程序时 一条错误消息告诉我安装的 gems 版本错误 关于检查Gemfile lock我注意
  • 使用 Objective C 读取发布到设备控制台的日志消息

    我的 iOS 应用程序如何从设备控制台日志中读取消息 我想以编程方式读取这些日志条目 例如读取文件 选择一些日志条目 然后通过电子邮件将其发送给支持人员 我知道有一款 iPhone 应用程序可以让您查看日志 它的名字是控制台 但是 我无法弄
  • 禁用 Zsh 中远程分支的自动完成功能?

    这与禁用 Git Bash 中远程分支的自动完成功能 https stackoverflow com questions 6623649 disable auto completion of remote branches in git b
  • MD5产生碰撞之前有多少个随机元素?

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 我在 Amazon S3 上有一个图像库 对于每个图像 我在服务器上对源 URL 进行 md5
  • Xcode - 我更换了硬盘,现在项目无法构建

    我很快更换了故障硬盘 我检查的所有文件似乎都正常 但是 我的 Xcode 项目无法编译 我收到这条消息 error PCH was compiled with module cache path Volumes MacintoshHD2 U
  • Lombok - 如何创建自定义设置器并应用于 java 中的不同成员

    我想了解如何在 Lombok 中创建自定义设置器并将该设置器应用于特定成员 我有一个有 100 名成员的班级 其中 50 名成员有一个自定义设置器 在设置值之前检查 X 内容 另外 50 名成员有一个自定义设置器 在设置值之前检查 Y 内容
  • Android:如何配置“tinymix”以使用“tinycap”录制系统音频

    在 Android 中 目前无法使用 Android SDK 录制系统音频 因此 我尝试了一下 TinyALSA 自 Android 4 起 希望可以重新路由音频输出 以便可以录制它 当我在设备上调用 tinymix 时 我得到以下配置 c
  • 如何检测非 IEEE-754 浮点,以及如何使用它们?

    我正在为基本类型编写类 因此代码在多个平台和编译器上在逻辑上是相同的 例如int least16 t for int 为了娱乐 我还是个学生 我读到了这个 float 匹配 IEEE 754 binary32 格式如果支持的话 https
  • 如何使用 Laravel 获取服务器 IP

    使用 Laravel 我可以获取客户端 IPrequest gt ip 有没有Laravel 内置方式获取服务器IP 或者这是 不可能 的事情 与SERVER ADDR可靠性 您可以使用请求对象 request gt server SERV
  • Java调度执行器的准确性

    我在使用 Java 调度执行器时遇到了一个奇怪的情况 我想知道我遇到的情况是否正常 我需要安排以 5 秒的预定义速率执行的任务 预计这些任务的执行时间有时会超过 5 秒 但当运行它们的时间低于 5 秒时 备份的任务列表应快速连续运行以赶上