java - 高频环路

标签 java

如何制作一个每秒以规则(!)间隔执行约 10000 次的循环?

(continuous data acquisition from parallel port in Java的重复,但那个很难找到,没有答案,而且很旧)

我查看了 Thread.sleep(long millis)Thread.sleep(long millis, int nanos),但 Windows 上的 Oracle J2SE 虚拟机总是 hibernate 多 1 毫秒比我指定的要多。此外,nanos字段似乎四舍五入到下一个整毫秒(已验证,这是硬编码在Thread.java的源代码中)。

实验结果:

  • Thread.sleep(0) 不 hibernate (100% cpu)
  • Thread.sleep(1) 平均 hibernate 1.95ms
  • Thread.sleep(2) 平均 hibernate 2.95 毫秒
  • Thread.sleep(0, 0) 不 hibernate (100% cpu)
  • Thread.sleep(0, 1) 平均 hibernate 1.95 毫秒

那么我怎样才能创建一个每秒以固定时间间隔迭代超过 500 次的循环呢?

编辑:我稍微放松了“常规”要求。如果一个延迟比另一个延迟短 4 倍(即抖动不是问题),那么只要最长延迟是确定性的并且低于 0.1 毫秒,那么这不是一个大问题。 (ScheduledExecutorService 的情况并非如此)

最佳答案

我相信您正在寻找ScheduledExecutorService (请参阅使用示例)。

具体

scheduleAtFixedRate(可运行命令,长初始延迟,长周期,TimeUnit 单位)

创建并执行一个周期性操作,该操作在给定的初始延迟后首先启用,然后在给定的周期内启用;也就是说,执行将在initialDelay之后开始,然后是initialDelay+period,然后是initialDelay + 2 * period,依此类推。

使用 TimeUnit.MICROSECONDS。

关于java - 高频环路,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14182505/

相关文章:

java - double -> 提取整数

java - 检测并转换字符串 Java 中的 URL,正则表达式更好还是更快?

java - 黑莓:BitmapField 作为按钮

java - DAO 类实例与 DAO EJB

java - Kafka消费者-消费者进程和线程与主题分区的关系是什么

java - 如何创建新文件夹?

java - 屏幕不刷新 swing java

java - Activity 对话框显示模糊 View

java - 有没有办法处理 LinkedHashMap 中相同的值?

java - DOM 解析器错误的 childNodes 计数