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

线睡眠(毫秒)精度[重复]

卫昊东
2023-03-14

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

long t1=System.nanoTime();
    try{
        Thread.sleep(500);
    }catch(InterruptedException e){}
    long t2=System.nanoTime();

    System.out.println((t2-t1)+" nanoseconds");
    System.out.println((500*1000000-(t2-t1))+" nanoseconds");

有时输出是

499795328 nanoseconds
204672 nanoseconds

共有2个答案

胡曾笑
2023-03-14

API文档说时间是

取决于系统计时器和调度程序的精度和准确性

因此,它将Hibernate的确切时间尚未定义。
话虽如此,如果线程在一毫秒的中途开始Hibernate,然后在指定的毫秒开始时唤醒,那么它可以Hibernate长达1毫秒,那么它就可以减少1毫秒。
如果你需要精确的计时,那么Thread.sleep可能是错误的工具,事实上,任何垃圾回收语言都可能是错误的工具。

在更精确的延迟或时间段上运行代码的一种方法是使用ScheduledExecutorService

云宝
2023-03-14

我知道可能只有500多一点,但永远不会低于这个数字。

我不知道你从哪里得到这个想法。文档非常清楚地表明,它将“Hibernate指定的毫秒数,具体取决于系统计时器和调度程序的精度和准确性”。

无法保证持续时间是绝对最小值。

如果你想更接近理想,你已经有了一半的解决方案,因为你正在计算时间还剩多少纳秒。要计算出多睡多少毫秒,可以将不足时间(本例中为204672毫秒)除以1000,然后再睡一次。

事实上,您可能希望在循环中执行此操作,直到剩余时间为零。类似以下伪代码的代码可能会起作用:

def sleepFor (ms):
    baseTime = System.nanoTime()
    remainingTime = ms
    while remainingTime > 0:
        Thread.sleep(remainingTime)
        nowTime = System.nanoTime()
        remainingTime = ms - (nowTime - baseTime) / 1000

或者你可以简单地接受这样一个事实,即足够接近就足够好了,因为你的误差似乎约为0.04%(约为百万分之400)。

 类似资料:
  • 我在代码中使用倒计时。问题是,倒计时不准确。onTick方法并不总是每秒执行一次,它可能需要几毫秒的时间。当试图基于millisUntilFinished执行某项任务时,这会成为一个问题。当我的20秒计时器超过10秒时,我正在尝试登录: 以下是相关代码: 这里出现了一个问题,因为countDownTimer可能永远不会有millisUntilFinished==10000,它可能等于1001,因此

  • 我正在尝试使用Java开发2D游戏。到目前为止,我已经设法将游戏设置为使用全屏独占模式,并在自定义线程中进行活动渲染。我决定使用的游戏循环是固定时间步长变量渲染类型。这种类型的游戏循环应该尽可能快地渲染设备可以处理,我对此并不完全满意。所以我试图使用来限制帧速率。 如果我关闭所有渲染,并简单地在游戏循环中更新游戏,< code>Thread.sleep(1)大约在< code>1 ms内成功Hib

  • 我现在用SDL2编程。所有这些都可以正常工作,但我对方法有一个问题。通常,它应该以毫秒为单位返回应用程序的总时间,但它总是在大部分时间返回值0,有时返回值1。 我用标志初始化SDL。 以下代码的问题是循环太快,因此增量时间小于1 ms。是否有方法实现更高的精度?

  • 问题内容: 我知道POSIX 函数会使程序hibernatex秒。在C ++中是否有使程序hibernatex 毫秒 的功能? 问题答案: 请注意,毫秒级没有标准的C API,因此(在Unix上)您必须满足,它接受微秒:

  • 我在Eclipse中有一些具有以下结构的代码: 我的期望是,在第一个代码运行后,等待10秒,然后等待第二个代码和其他10秒。但实际上,编译器在不等待我设置的10秒的情况下一个接一个地运行命令。 是否有任何强制条件使其工作? 非常感谢。

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