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

线程睡眠的准确性如何?

宁良平
2023-03-14

我正在研究计算机硬件,在那里我们了解到使用硬件计时器比软件延迟获得更准确的结果。我已经在汇编中编写了1毫秒的软件延迟,我可以启动一个进程,使用这个延迟每毫秒重复一次,并使用计数器每100毫秒做一些其他事情,这种技术不如使用我现在要使用的硬件内置的硬件计时器准确。

所以我想知道Java内置的计时有多精确?我们有< code > system . current time millis 和< code>Thread.sleep,它们可能不使用硬件计时器,那么这些内置的Java方法与硬件计时器相比有多精确呢?

共有3个答案

何聪
2023-03-14

来自Java语言规范。

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

公良莫希
2023-03-14

我不认为Thread.sleep是准确的。事实上,我发现它的睡眠时间似乎比它promise的要少。

配置为Hibernate 1 毫秒时的结果:

********* Average elapsed time = 957 micro seconds

下面是我的测试:

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);
}
申屠晟
2023-03-14

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

在进行实时模拟时,您必须纠正主循环中睡眠的不准确性。这可以通过计算预期的唤醒时间并将其与实际唤醒时间进行比较来完成,并在下一个循环中纠正差异。

如果您需要更好的性能,请查看Java实时系统规范。我自己还没有使用过它,因此无法提供更多详细信息。

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

  • 问题内容: 有谁知道一个为Java提供Thread.sleep()的库,该库的错误不超过1-2毫秒? 我尝试了睡眠,错误测量和BusyWait的混合,但在不同的Windows机器上却无法获得这种可靠性。 如果该实现也可用于Linux和MacOS,则它可以是本机实现。 编辑 Nick提供的链接(http://blogs.oracle.com/dholmes/entry/inside_the_hots

  • 我使用 C 和 POSIX 线程创建了一个多线程应用程序。我现在应该阻塞一个线程(主线程),直到设置了布尔标志(变为真)。 我找到了两种方法来完成这件事。 > 在没有睡眠的情况下旋转。 在睡眠中旋转循环。 如果我应该遵循第一种方式,为什么有些人编写代码遵循第二种方式?如果应该使用第二种方法,为什么要让当前线程Hibernate呢?这种方式的缺点是什么?

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

  • 我正在编写一个基于await/sleep范式的网络绑定应用程序。 我更喜欢这样一个答案,不创建任何额外的线程

  • 我正在调用while循环内的线程Hibernate1秒。当标志为true时,循环将运行(标志为true无限时间)。在循环内,线程应Hibernate1秒,唤醒并增加计数器,检查IF条件,如果为FALSE,则应再次Hibernate1秒并继续29次。在第30次迭代中,IF条件为true,IF语句中调用的方法将收集并存储数据。最后,在第32次迭代中,第二个IF语句将把存储的数据发送到服务器,并将计数设