如何在Windows中使用粗略的计时器分辨率编写Java Thread.sleep()

如何在Windows中使用粗略的计时器分辨率编写Java Thread.sleep(),java,thread-sleep,system-clock,Java,Thread Sleep,System Clock,我有一个应用程序使用Thread.SleepMsunticationRequired;。变量设置为毫秒数,直到我希望程序开始与一天中的时间一致的操作,因此它不是关键。即使关闭5000毫秒也不成问题,因此10毫秒的分辨率是多余的 小问题是Windows报告程序或服务请求的计时器分辨率小于平台最大计时器分辨率 没有必要让计时器的分辨率这么小。我已将ms四舍五入到10ms的最接近倍数,但没有明显效果 如何更改程序或JVM设置以使请求的计时器分辨率不太小?您无法直接从Java控制计时器分辨率 JVM和/

我有一个应用程序使用Thread.SleepMsunticationRequired;。变量设置为毫秒数,直到我希望程序开始与一天中的时间一致的操作,因此它不是关键。即使关闭5000毫秒也不成问题,因此10毫秒的分辨率是多余的

小问题是Windows报告程序或服务请求的计时器分辨率小于平台最大计时器分辨率

没有必要让计时器的分辨率这么小。我已将ms四舍五入到10ms的最接近倍数,但没有明显效果

如何更改程序或JVM设置以使请求的计时器分辨率不太小?

您无法直接从Java控制计时器分辨率

JVM和/或其他应用程序有时会降低平台计时器的分辨率,这是由于更平滑的动画和其他原因。Java不能控制平台计时器的分辨率

您确定Java运行时负责提高计时器分辨率吗?您是否尝试过使用其他JRE


如果要更改计时器分辨率,则需要JNI。但是布鲁斯·道森(Bruce Dawson)有一篇有趣的文章,讲述了为什么不想增加计时器分辨率,从而浪费电能和计算能力。

有点困惑。也许整数溢出会产生负数?也许太小了

if (msUntilActionNeeded < 0) {
    throw new IllegalStateException();
} else if (msUntilActionNeeded > 100L) {
    Thread.sleep(msUntilActionNeeded);
}

在上面,我说我已经将ms四舍五入到最接近的10ms的倍数,但是我发现了一个我没有这样做的例子。我将其中一个和另一个Thread.sleep改为四舍五入到最接近的100ms长的msUntilWake=getMsUntilNextEvent-LEAD\u TIME\u MS+50/100*100;而且分辨率太小的错误消失了!