线程睡眠和精确计时

时间:2014-04-19 11:38:47

标签: java multithreading sleep thread-sleep

我正在制作一个代码,我希望在时间上有一定的精确度。我使用机器人进行一些操作,然后在操作之间使用Thread.sleep(some_time) some_time。但是我没有得到最好的结果,因为当我搜索它时,sleep并不准确。实现这一目标的最佳方法是什么?我的意思是用其他方法模拟Thread.sleep

2 个答案:

答案 0 :(得分:7)

现代操作系统中的计时从来都不准确,除非您使用为此明确设计的语言/框架。但是,在大多数操作系统中,您可以使用合理的不确定性。但是"合理的"取决于你试图解决的问题。

在Java中,Thread.sleep是一个非常基本的实现,在我看来过于滥用。 Java提供这些基本的线程工具并不是因为它们是最佳解决方案,而是因为它们是基本工具。 Java还提供了许多其他更复杂的工具,可以更好地满足您的需求。

例如,如果你想要"精确"在时间方面,您可以改为使用ScheduledExecutorService,它使用OS调度服务提供至少毫秒的精度,甚至通常为纳秒。虽然它不是精确到纳秒(尽管提供),但它通常比Thread.sleep更准确。但是在严重超负荷的系统上,两者都不准确。如果这足以解决您的问题,那么您应该采用这种方法。否则,您需要一个不同的语言/执行环境。

答案 1 :(得分:3)

实际上,Java依靠OS工具来实现其定时器 1 。您在定时器上的准确度不超过1毫秒的真正原因是这是典型(非实时)操作系统提供的限制。即使时间分辨率更精细,操作系统仍然无法保证唤醒"用户进程恰好是应用程序要求的时间。

如果您需要实时(即硬)实时行为,包括高精度定时器和时钟,则需要实时操作系统,并且需要在其上运行Realtime Java


1 - 这些与C和C ++库使用的操作系统相同。因此,简单地切换到C或C ++不会有太大帮助。