首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Thread.sleep的准确性有多高?

Thread.sleep的准确性有多高?
EN

Stack Overflow用户
提问于 2013-09-11 16:52:22
回答 3查看 10.8K关注 0票数 22

我正在学习计算机硬件,在那里我们了解到,使用硬件计时器比使用软件延迟可以获得更准确的结果。我已经在汇编中写了一个1毫秒的软件延迟,我可以使用这个延迟开始一个每毫秒重复的过程,使用计数器每100毫秒做一些其他的事情,这种技术比我现在要使用的硬件内置的硬件计时器的精确度要低。

所以我想知道Java内置的计时有多精确?我们有System.currentTimeMillisThread.sleep,它们可能不使用硬件计时器,那么与硬件计时器相比,这些内置的Java方法的准确性如何呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-11 17:13:57

Thread.sleep()是不准确的。不准确程度取决于底层操作系统及其计时器和调度器。我曾经经历过并行进行的垃圾收集会导致过度睡眠。

当做“实时”模拟时,你必须纠正你的主循环sleep的不准确性。这可以通过计算预期唤醒时间,并将其与实际唤醒时间进行比较,并在下一个循环中校正差异来实现。

如果您需要更好的性能,可以看看Java Real-Time System specification。我自己还没有用过它,所以我不能提供更多细节。

票数 15
EN

Stack Overflow用户

发布于 2016-09-13 23:54:53

我没有发现Thread.sleep是准确的。事实上,我发现它的睡眠似乎比它承诺的要少。

配置为休眠1毫秒时的结果:

代码语言:javascript
运行
复制
********* Average elapsed time = 957 micro seconds

下面是我的测试:

代码语言:javascript
运行
复制
public static void main(String[] args) throws InterruptedException {
    List<Long> list = new ArrayList<Long>();

    int i= 0;
    while(i <=100){

        long authStartTime = System.nanoTime();
        Thread.sleep(1);
        long elapsedTime = System.nanoTime() - authStartTime;
        System.out.println("*****"+elapsedTime/1000+ " mics");
        list.add(elapsedTime);
        i++;
    }

    long sum=0;
    for(long l : list){
        sum = sum + l;
    }
    System.out.println("********* Average elapsed time = "+sum/list.size()/1000+" micro seconds");
    System.exit(0);
}
票数 4
EN

Stack Overflow用户

发布于 2013-09-11 17:06:55

来自Java语言规范。

Thread.sleep使当前执行的线程在指定的持续时间内休眠(暂时停止执行),这取决于系统计时器和调度程序的精确度和准确性。线程不会失去任何监视器的所有权,执行的恢复将取决于执行线程的调度和处理器的可用性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18736681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档