如何制作一个每秒以规则(!)间隔执行约 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.95msThread.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/