java - 线程 sleep 未等待正确的时间

标签 java sleep

我正在尝试使用多线程系统,如果我没有及时收到答案,我会超时并遇到以下问题:

public class proba6 {

    public static void main(String[] args) {
        proba6 p = new proba6();
        for (int i = 0; i < 3; i++) {
            p.cycle();
        }

    }

    public void cycle() {
        try {
            long startTime = System.nanoTime();
            Thread.sleep(1000);
            long endTime =System.nanoTime();
            long estimatedTime = endTime - startTime;
            System.out.println("estimatedTime > limit: " + estimatedTime + ">" + 1000000000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

因此,在第一个周期中,大多数时候 estimatedTime 都小于 1000000000。之后就可以正常工作了。你知道原因吗?

最佳答案

假设“较小”你的意思是“稍微小”,就像 estimatedTime = 999999321 那么这是正常的。

基本上,您停止了线程,这意味着操作系统需要发送中断,保存线程的当前状态,调用另一个线程来代替它,一秒钟后,系统需要再次唤醒您的线程。因此它将检查是否有可用的计算时间,如果没有,它可能会尝试中断另一个线程(见上文),或者甚至可能等待几微秒让另一个线程停止。然后它恢复之前停止的线程的状态并继续执行。

查看 Thread.sleep()文档描述,他们说:

(...) However, these sleep times are not guaranteed to be precise, because they are limited by the facilities provided by the underlying OS. Also, the sleep period can be terminated by interrupts, as we'll see in a later section. In any case, you cannot assume that invoking sleep will suspend the thread for precisely the time period specified.

关于java - 线程 sleep 未等待正确的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58181960/

相关文章:

安卓 : Listen to packet data when Android in sleep mode

Python 的 sleep() CPU 使用率

java - java中main方法中字符串参数是必须的吗?什么时候读取参数?

java - HashSet 与 ArrayList 速度?插入与查找(Java)

c# - 为什么 Thread.Sleep 如此有害

Python:做点什么然后 sleep ,重复

cocoa - 笔记本电脑盖关闭时的通知

java - JCuda错误: undefined symbol: Pointer_buffer

java - 如何获取当前单元格被点击的表格?

java - Firebase/GeoQuery - 最大半径 IF 语句