Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Thread.sleep等待的时间超出预期_Java_Multithreading_Thread Sleep - Fatal编程技术网

Java Thread.sleep等待的时间超出预期

Java Thread.sleep等待的时间超出预期,java,multithreading,thread-sleep,Java,Multithreading,Thread Sleep,以下代码: long msBefore = System.currentTimeMillis(); //Thread.currentThread().setPriority(Thread.MAX_PRIORITY); try {Thread.sleep(200); } catch (InterruptedException e){} System.out.println("Time: " + (System.currentTimeMillis() - msBefore)); 印刷品: Time

以下代码:

long msBefore = System.currentTimeMillis();
//Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
try
{Thread.sleep(200);
} catch (InterruptedException e){}
System.out.println("Time: " + (System.currentTimeMillis() - msBefore));
印刷品:

Time: 578
Time: 594
Time: 625
Time: 640
Time: 641
Time: 609
Time: 625
Time: 625
Time: 610
Time: 609
Time: 625
Time: 625
Time: 422
Time: 625
Time: 594
Time: 609
Time: 625
Time: 594
Time: 594
Time: 625

哪里有问题???

这里没有问题。从javadoc:

以系统和系统的准确性为准 调度员

通常,依赖睡眠间隔是不好的设计,因为在不同的系统和JVM实现中,睡眠间隔可能不同。改用wait()和notify(),或者更好——使用java.util.concurrent包


我要求每秒发送n条消息,我认为等待/通知不合适,对吗

如果您有一个严格的时间要求,那么您将需要使用一个实现。主流SE和ME Java实现不适合硬实时应用程序

有各种各样的技巧,你可以用来满足这些要求“大部分时间”。。。但是,如果您的应用程序/系统过载,您可能会开始丢失所需的消息速率


真正的问题不在于计时器的准确性,而在于非实时调度程序不能(也不能)保证在计时器过期时安排线程运行。

您没有考虑线程处理所花费的时间

    try {
        long processingStart = System.currentTimeMillis();

        long processingFinish = System.currentTimeMillis();
        long processTime = 600 - (processingFinish - processingStart);
        Thread.sleep(processTime);

    } catch (InterruptedException ex) {

    }

如果您确实需要固定的消息速率,可以实现类似旋转锁的功能。它将消耗单CPU核心,但会让你接近

long nextTime = System.currentTimeMillis() + interval;
while (keepRunning) {
   while (nextTime - System.currentTimeMillis() > 0)
       ;
   sendMessage();
   nextTime += interval;
}

我要求每秒发送n条消息,我认为等待/通知不合适,对吗?等待/通知使用与睡眠相同的计时器。它同样准确。真正的问题不是计时器的准确性。问题在于保证在计时器到期时立即调度线程。那几乎是不可能的。。。除非你在一个支持实时的操作系统上使用实时Java,否则定时器将不会有任何帮助。400ms的差异与不准确无关。wait()/notify()和concurrent的代码在准确性方面没有什么不同(因为它依赖于相同的操作系统信号)。400ms仅仅意味着一些其他线程阻止进程和线程占用自己的时间量。Stephen在moneysleep上的回答是正确的,它意味着在当前线程上暂停执行至少一个指定的时间,而不是一个指定的时间。虽然您受到系统准确性的约束,但它应该比这更接近。在我的Windows和Linux系统上,它很少比预期的长2毫秒以上。你有什么?嗨,穆罕默德。正如其他人所指出的,这将取决于您的系统的准确性(即使是环境因素,如温度,也会起作用)。出于好奇,您试图用此代码解决的实际问题是什么?根据您的回答,这里的某个人可能能够帮助您找到更好的方法(例如,TimerTaskExecutor可以更准确地打印常规心跳)。请确保你用不同的思路提出这个问题。干杯。我已经运行了好几次了,现在它在很大程度上是准确的。谢谢大家的帮助。谢谢你的链接和信息。