【问题标题】:How to sleep a thread in java for few milliseconds?如何让java中的线程休眠几毫秒?
【发布时间】:2021-11-20 15:51:20
【问题描述】:

我想让一个线程休眠 1 毫秒。我曾经在 java 代码中实现睡眠,Thread.sleep(x) 是 x 我想要睡眠的毫秒数。但是,我看到它不会在几毫秒(1 毫秒)内工作,因为睡眠放弃了线程的时间片。也就是说,线程实际停止的最短时间由内部系统计时器确定,但不少于 10 或 25 毫秒(取决于操作系统)。

有没有办法在几毫秒内实现它,例如10 毫秒还是 1 毫秒?

【问题讨论】:

  • 你的用例是什么?
  • 我不确定您的问题为何被否决。这是个好问题。

标签: java multithreading sleep milliseconds


【解决方案1】:

“放弃线程的时间片”和“睡眠”的意思大致相同。如果你想要一个不“休眠”的延迟,那么你需要你的线程“旋转”,在这段时间内什么都不做。例如,

static void spin(long delay_in_milliseconds) {
    long delay_in_nanoseconds = delay_in_milliseconds*1000000;
    long start_time = System.nanoTime();
    while (true) {
        long now = System.nanoTime();
        long time_spent_sleeping_thus_far = now - start_time;
        if (time_spent_sleeping_thus_far >= delay_in_nanoseconds) {
            break;
        }
    }
}

spin(n) 的调用将消耗n 毫秒的CPU 时间,这是在不“放弃时间片”的情况下延迟线程的唯一方法。


P.S.,你说,“我看到它 [sleep()] 不起作用......” 为什么?你看见什么了?您是否真的测量程序的性能,并发现它并不令人满意?还是您的程序未能满足某些hard real-time 要求?如果您的程序有实时要求,那么您可能想了解“Real-time Specification for Java”(RTSJ)。

另请参阅,https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/System.html#nanoTime()

【讨论】:

  • 您的示例因长时间溢出而损坏。
  • @pveentjer,谢谢。我改变了我的例子。老实说,我不确定现代 Java 是如何处理数值溢出的,但我的新示例中的逻辑正是我过去几十年在使用 16-bit ints 和一个(在某些情况下)每分钟溢出一次以上的计数器。即使有溢出,减法总是给出有用的结果。但那是在 C 标准委员会发明“未定义行为”并授予编译器编写者许可以优化依赖它的代码之前。
  • 我也不是专家。我总是检查文档并应用 Javadoc 中提供的示例。
【解决方案2】:

我认为操作系统不会让你这样做。我最好的选择是这样做,也许是一个会消耗一些时间的小循环。但是也要小心 java 编译器,因为它可能通过执行死代码分析来消除无意义的循环。所以只需存储循环的结果并在循环中,执行一些除法或模数,这些非常消耗时间。

但总的来说,这都是一种 hack,您通常应该避免做如此小的延迟。通常它们不会改善用户体验,但仍会导致代码复杂

【讨论】:

  • 你能给出一些代码作为例子吗?为此,请编辑您的问题并添加所有内容!
【解决方案3】:

就像已经提到的其他海报一样,您没有太多控制权。尤其是不使用 Thread.sleep。 LockSupport.parkNanos 是一种更可靠的方法。这应该在 Linux 上为您提供至少 50 us 的粒度。

欲了解更多信息,请参阅这个优秀的post

还要记住,如果其他进程正在运行,很容易出现多毫秒的暂停。中断处理也会造成很大的干扰。当然,Java GC 和 JVM 的其他各个方面,例如(重新)jitting、偏向锁撤销、调用堆栈采样(取决于机制)等也可能是暂停的原因。

【讨论】:

    猜你喜欢
    • 2011-05-10
    • 2019-03-07
    • 2015-05-07
    • 2010-09-10
    • 2010-09-27
    • 2011-08-13
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    相关资源
    最近更新 更多