当前位置: 首页 > 面试题库 >

Windows上的Java准确睡眠

笪健
2023-03-14
问题内容

有谁知道一个为Java提供Thread.sleep()的库,该库的错误不超过1-2毫秒?

我尝试了睡眠,错误测量和BusyWait的混合,但在不同的Windows机器上却无法获得这种可靠性。

如果该实现也可用于Linux和MacOS,则它可以是本机实现。

编辑
Nick提供的链接(http://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks)是了解Java各种计时器/睡眠/时钟问题的一个很好的资源。


问题答案:

为了提高睡眠的粒度,您可以从Thread.sleep页面尝试以下操作。

Windows下Thread.sleep()的错误

如果计时对您的应用程序至关重要,那么解决这些错误的一种优雅而实用的方法是让守护程序线程在应用程序的整个运行期间一直运行,而该线程只需休眠大量的毫秒数(Long.MAX_VALUE即可)。这样,将在每次调用应用程序时设置一次中断时间,以最小化对系统时钟的影响,并将睡眠粒度设置为1ms,即使默认中断时间不是15ms。

该页面还提到,它会导致Windows的系统范围更改,由于此bug可能导致用户的时钟快速运行。

编辑

有关更多信息,请参见
此处,以及Sun
的相关错误报告。



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

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

  • 问题内容: 看来不是很准确。 看到这个例子: 结果是(在Windows XP上): 为什么不是呢?以及如何获得当前时间的精确毫秒数? 问题答案: 这是完全可以预期的。您会在.NET上使用看到相同的东西。(有关该主题的面向.NET的观点,请参阅Eric Lippert的博客文章。) 您可以使用来获得更精确的计时器 ,仅用于测量 -这并不意味着要给出 绝对的 时间,而只是用于测量 间隔 。 我不知道从

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

  • 问题内容: 当我执行以下程序时,我就知道了 精度问题 : 输出为: (请原谅无组织的输出)。我注意到了几件事: sin 30即存储为。 棕褐色45即存储为。 tan 90即或存储为(这是一个非常大的数字)。 自然,我很困惑地看到输出(即使在解密输出之后)。 所以我读了这篇文章,最佳答案告诉我: 这些精度问题是由于浮点数>点号的内部表示而引起的,您无法做很多事情来避免这种情况。 顺便说一下,使用现代

  • 问题内容: 我在标准Windows命令窗口中有一个正在运行的Java进程。即我已经运行’cmd’并在java -jar中键入… 我需要尽可能获得所有线程的完整堆栈转储。 我记得在Linux下,您可以通过quit命令上的选项将消息发送到JVM。 在此文件中为太阳状态 若要在Windows 95或Windows NT平台上生成堆栈跟踪,请在运行Java程序的窗口中输入键序列,或单击窗口上的“关闭”按钮