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

JavaThread.sleep最短时间[重复]

公西兴业
2023-03-14

时间单位睡眠(长超时)文档这样描述其参数:

超时 - 最小睡眠时间。

但是,我发现 - 至少在Windows 7 64位Java 8更新141上 - 线程的睡眠时间通常低于最低要求:

public static void main(String[] args) throws InterruptedException {
    final long from = TimeUnit.MILLISECONDS.toNanos(100);
    final long to   = TimeUnit.MILLISECONDS.toNanos(1000);
    final long step = TimeUnit.MILLISECONDS.toNanos(100);
    for (long requestedSleepDuration = from; requestedSleepDuration < to; requestedSleepDuration += step) {
        long sleepStartTime = System.nanoTime();
        TimeUnit.NANOSECONDS.sleep(requestedSleepDuration);
        long sleepEndTime = System.nanoTime();
        System.out.printf(
                "requested=%9d  actual=%9d  %s%n",
                requestedSleepDuration,
                sleepEndTime - sleepStartTime,
                (sleepEndTime - sleepStartTime >= requestedSleepDuration ? "OK" : " Slept less than minimum!"));
    }
}

典型输出:

requested=100000000  actual= 99534864  Slept less than minimum!
requested=200000000  actual=200063646  OK
requested=300000000  actual=299223086  Slept less than minimum!
requested=400000000  actual=399598620  Slept less than minimum!
requested=500000000  actual=499910360  Slept less than minimum!
requested=600000000  actual=600028523  OK
requested=700000000  actual=699604816  Slept less than minimum!
requested=800000000  actual=799230602  Slept less than minimum!
requested=900000000  actual=899490648  Slept less than minimum!

这似乎与文件相矛盾。然而,TimeUnit文档还声明< code>TimeUnit.sleep()是< code>Thread.sleep的便利包装器,后者没有说明它是否保证至少睡眠指定的时间。

这是 API 实现错误,还是时间单元睡眠和/或线程睡眠被设计为仅Hibernate大约而不是至少指定的持续时间?

共有1个答案

解晟睿
2023-03-14

TimeUnit(时间单位)。sleep()委托给Thread.sleep()

Thread.sleep()受制于系统计时器和调度程序的精度和准确性,因此TimeUnit.sleep()不会像您需要的那样准确。

 类似资料:
  • 最短接驾时间预估 说明 下单前,预估周围符合条件的车辆的最短接驾时间和距离,仅做参考 最短接驾时间预估暂不支持优享车型 地址URL /v1/common/minduration 支持格式 {url}?k1=v1&k2=v2&k3=v3&... HTTP请求方式 GET 是否需要登录 是 关于登录授权,参见 如何登录授权 访问授权限制 暂无 请求参数 名称 类型 必选 描述 client_id st

  • 最短接驾时间预估 基本描述 最短接驾时间预估是在定位起点后,乘客下单前,获取的周边可接驾司机的预估接驾时间。信息可做乘客下单前参考。 优享车型暂不支持最短接驾时间预估 业务流程示例 接入流程 1.开发接入 如果您还未接入用车 API,请先接入用车API,详情请联系滴滴商务。 如果您已经接入用车 API,请根据要求调用最短接驾时间预估接口即可。 2.功能测试 此接口不需要单独测试,接入后查看是否返回

  • 迷宫问题之最短时间 小明某天不小心进入了一个迷宫(如上图所示),请帮他计算走出迷宫的最少的时间。规定每走一格需要1个单位时间。如果不能走到出口,则输出impossible。每次能走的仅有上、下、左、右4个方向。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据首先输入2个整数n,m(0<n,m≤100),代表迷宫的高和宽,然后n行,每行m个字符,其中各字符的含义如下: 'S’代表小明现在所在

  • 如果它们是具有以下数据的两个过程,甘特图应该如何?(SRTF 调度) 进程到达突发 P1 0 17 P2 1 16 那么,进程P1会先完成,然后P2会开始执行……还是P1必须等待16毫秒?

  • 我正在尝试在 java 中模拟 CPU 调度算法并使用多线程。我已经成功地实施了FCFS(先到先得)和SJF(最短的工作优先)。但问题是当我开始想到SRTF(最短剩余时间优先)时,它是SJF的一种先发制人的形式。我正在使用以下模型: CPU的线程,它有一个变量,它每保持滴答声(一个简单的时钟增量)。我有一个标志,用于在开始执行之前检查CPU是否可用。 长期调度程序(LTS)的线程,它将进程从进程列

  • 该算法是SJF调度的抢先版本。 在SRTF中,过程的执行可以在一段时间后停止。 在每个进程到来时,短期调度程序在可用进程列表和正在运行的进程中以最少的剩余突发时间安排进程。 一旦所有进程都在就绪队列中可用,就不会执行抢占,并且该算法将作为SJF调度工作。 当进程从执行中被移除并且下一个进程被调度时,进程的上下文被保存在进程控制块中。 该PCB在下一次执行该过程时被访问。 示例 在这个例子中,有五个