线程休眠和精确计时

7

我正在编写一段代码,需要在时间上精确控制。我使用机器人执行某些操作,然后使用Thread.sleep(some_time)让操作之间经过some_time的时间间隔。但是我得出的结果并不理想,因为我发现sleep并不准确。有什么更好的方法可以实现这个功能?我的意思是用其他方法模拟Thread.sleep


4
如果你需要实时行为,无论是Java还是C或C++都不能提供超出操作系统所做的任何保证。你需要一个实时操作系统。 - user207421
@Bratty 你可以从 Java 中调用 C/C++,事实上这也是 Thread.sleep() 的实现方式,你能解释一下你的意思吗? - Peter Lawrey
1
@PeterLawrey - 读懂其中含义,此贴楼主很可能希望应用程序线程以1毫秒或更高的准确度“唤醒”...以避免机器人在某些物理运动中超调。这是严格实时的东西。真正的问题是非实时操作系统无法保证次毫秒级别的唤醒。 - Stephen C
一种选择是在超时前约5毫秒唤醒并开始减速,这样你就很少有超调的机会。即工程化对几毫秒抖动的容忍度。 - Peter Lawrey
我认为这与标记的重复不同:另一个问题只是询问Thread.sleep的精度,而这个问题则是要求替代的睡眠方法。这两个问题应该有不同的答案。 - bluenote10
显示剩余4条评论
2个回答

7
现代操作系统中的定时永远不是精确的,除非您使用专门为此设计的语言/框架。但是,在大多数操作系统中,您可以使用合理的不确定性来处理。但是,“合理”取决于您要解决的问题。
在Java中,Thread.sleep是一种非常基本的实现,我认为它被过度使用了。 Java提供这些基本线程工具并不是因为它们是最好的解决方案,而是因为它们是基本工具。 Java还提供了许多其他更复杂的工具,可能更适合您的需求。
例如,如果您想要“精确”的定时,可以使用ScheduledExecutorService,它使用OS调度服务以提供至少毫秒级甚至纳秒级的精度。尽管它不是精确到纳秒(尽管提供),但通常比Thread.sleep准确得多。但是,在负载过重的系统上,两者都不准确。如果这对您的问题足够,请使用此选项。否则,您需要使用不同的语言/执行环境。

3
事实上,Java依赖于操作系统设施来实现其定时器1。计时器精度不超过1毫秒的真正原因是这是典型(非实时)操作系统提供的限制。即使时间分辨率更高,操作系统仍无法保证在应用程序请求的精确时间“唤醒”用户进程。如果您需要实时行为(即硬实时),包括高精度计时器和时钟,则需要实时操作系统,并在其上运行Realtime Java

1 - 这些是C和C++库使用的相同操作系统设施。 因此,仅仅切换到C或C++并不能帮助太多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接