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
API文档说时间是
取决于系统计时器和调度程序的精度和准确性
因此,它将Hibernate的确切时间尚未定义。
话虽如此,如果线程在一毫秒的中途开始Hibernate,然后在指定的毫秒开始时唤醒,那么它可以Hibernate长达1毫秒,那么它就可以减少1毫秒。
如果你需要精确的计时,那么Thread.sleep可能是错误的工具,事实上,任何垃圾回收语言都可能是错误的工具。
在更精确的延迟或时间段上运行代码的一种方法是使用ScheduledExecutorService
我知道可能只有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秒的情况下一个接一个地运行命令。 是否有任何强制条件使其工作? 非常感谢。
我正在编写一个代码,希望在计时时有一定的精度。我使用机器人做一些动作,然后使用,以便在操作之间运行。但我并没有得到最好的结果,因为当我搜索它时,睡眠不准确。实现这一目标的最佳方式是什么?我的意思是模拟线程。用其他方法睡眠。