当前位置: 首页 > 知识库问答 >
问题:

线程睡眠和精确计时[复制]

安轶
2023-03-14

我正在编写一个代码,希望在计时时有一定的精度。我使用机器人做一些动作,然后使用Thread。睡眠(sometime),以便在操作之间运行。但我并没有得到最好的结果,因为当我搜索它时,睡眠不准确。实现这一目标的最佳方式是什么?我的意思是模拟线程。用其他方法睡眠。

共有2个答案

曹君墨
2023-03-14

事实上,Java依赖操作系统设施来实现其计时器。计时器的精度不超过1毫秒的真正原因是,这是典型(非实时)操作系统所提供的极限。即使时间分辨率更精细,操作系统仍然不能保证在应用程序要求的时间“唤醒”用户进程。

如果您需要真实(即硬)的实时行为,包括高精度计时器和时钟,那么您需要一个实时操作系统,并且需要在其上运行实时Java。

< sup>1 -这些是C和C库使用的相同的操作系统工具。所以简单的换成C或者C并不会有太大的帮助。

杨学真
2023-03-14

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

在 Java 中,线程.sleep 是一个非常基本的实现,在我看来,它被过度使用了。Java提供这些基本的线程工具不是因为它们是最好的解决方案,而是因为它们是基本工具。Java还提供了许多其他更复杂的工具,这些工具可能更适合您的需求。

例如,如果您想要“精确”计时,则可以改用 ScheduledExecutorService,它使用操作系统调度服务来提供至少毫秒的精度,通常甚至纳秒。虽然它与纳秒并不精确(尽管有报价),但它通常比Thread.sleep更准确。但是,在严重过载的系统上,两者都不准确。如果这足以解决您的问题,那么您应该这样做。否则,您需要一个不同的语言/执行环境。

 类似资料:
  • sleep(500)将挂起当前线程至少500毫秒,我知道它可能会比500多一点,但绝不会少于这个时间。现在,1毫秒=1000000纳秒,我想暂停当前线程500毫秒,即=500*1000000纳秒,但当我运行以下代码时,它有时睡眠时间少于指定的纳秒值。这是为什么呢?以及如何至少睡500*1000000纳秒。 有时输出是

  • 问题内容: 我正在编写需要定时精确的代码。我用机器人进行一些操作,然后我用了行动之间要经过的。但是我没有得到最好的结果,因为当我搜索它时,它是不准确的。做到这一点的最佳方法是什么?我的意思是用其他方法模拟。 问题答案: 除非您使用专门为此设计的语言/框架,否则现代OS中的时序永远都不是精确的。但是,您可以在大多数操作系统中以合理的不确定性进行工作。但是“合理”取决于您要解决的问题。 在Java中,

  • 脚本: 一群汽车从北向南(viceversa)沿着一条双车道道路行驶。过了一会儿,他们到达了一座桥。这座桥是单向的,通行能力有限。一辆汽车花100毫秒通过这座桥。不允许发生交通碰撞。 假设我需要计算,对于所有的车, 从车辆请求进入桥梁到开始穿越之间的时间。 例如:如果一辆向北行驶的汽车到达桥上,发现桥上有汽车向南行驶,它必须等待。它需要等多久?当然,如果只有一辆车(桥是空的),汽车的等待时间=0。

  • 我正在调用while循环内的线程Hibernate1秒。当标志为true时,循环将运行(标志为true无限时间)。在循环内,线程应Hibernate1秒,唤醒并增加计数器,检查IF条件,如果为FALSE,则应再次Hibernate1秒并继续29次。在第30次迭代中,IF条件为true,IF语句中调用的方法将收集并存储数据。最后,在第32次迭代中,第二个IF语句将把存储的数据发送到服务器,并将计数设

  • 我正在研究计算机硬件,在那里我们了解到使用硬件计时器比软件延迟获得更准确的结果。我已经在汇编中编写了1毫秒的软件延迟,我可以启动一个进程,使用这个延迟每毫秒重复一次,并使用计数器每100毫秒做一些其他事情,这种技术不如使用我现在要使用的硬件内置的硬件计时器准确。 所以我想知道Java内置的计时有多精确?我们有< code > system . current time millis 和< code

  • 我使用 C 和 POSIX 线程创建了一个多线程应用程序。我现在应该阻塞一个线程(主线程),直到设置了布尔标志(变为真)。 我找到了两种方法来完成这件事。 > 在没有睡眠的情况下旋转。 在睡眠中旋转循环。 如果我应该遵循第一种方式,为什么有些人编写代码遵循第二种方式?如果应该使用第二种方法,为什么要让当前线程Hibernate呢?这种方式的缺点是什么?