java - object.wait 和 Thread.sleep() 的 CPU 周期

标签 java multithreading operating-system

等待和 sleep 的 CPU 周期行为有何不同。根据线程生命周期图可以清楚地看出,如果调用Thread.sleep()或object.wait,正在运行的线程将被插入阻塞状态,在此阻塞状态期间CPU周期将不会被使用。

如果我是正确的,那么为什么没有人在 Difference between wait() and sleep()

如有错误,请指正。

另外,根据我的理解,当调用 Thread.sleep(t) 时,在时间 t 之后,会生成中断信号,以便在下一个 cpu 周期中考虑此任务。在 object.wait() 的情况下会发生什么? object.wait()也会产生中断吗?

最佳答案

If I am correct then why not any body mentioned this in Difference between wait() and sleep()

(你是对的。)

  1. 因为这两种情况都是相同的,没有区别。您链接的问答旨在询问 sleepwait 之间的区别

  2. 可能是因为您阅读的具体答案的作者认为这与他们所说的内容不相关。或者因为他们认为这是显而易见的。

Also,As per my understanding when Thread.sleep(t) is called,after time t,interrupt signal is generated to consider this task also for next cpu cycle.what happens in case of object.wait()? does interrupt is also generated for object.wait()?

我认为您在这里谈论的是硬件中断,因为不涉及Java中断。

答案是它比你想象的要复杂得多。用于终止 Java sleep 和定时 wait 调用的计时器可能会也可能不会使用硬件中断来实现。这是操作系统特定的。但如果是的话,我希望操作系统以相同的方式实现它们。 (因为功能要求非常相似)。

粗略的实现是这样的:

  1. Java 通过 native 代码进行系统调用。系统调用请求:

    • N 毫秒后唤醒我,或者
    • 收到通知时或 N 毫秒后唤醒我
  2. 操作系统安排“唤醒”N 毫秒时间
  3. 操作系统将 native 线程标记为阻塞
  4. 大约 N 毫秒后,操作系统计时器(或其他)会解除对 native 线程的阻塞;即它变得可运行
  5. 操作系统线程调度程序立即或稍后将其调度到核心并运行线程。

    • 对于 sleep ,Java 线程只是运行
    • 对于定时等待,Java 运行时要么生成并抛出 InterruptedException,要么尝试重新获取互斥体等。后者可能会再次阻塞。

操作系统可以通过多种方式实现“N 毫秒后唤醒”。一些策略是:

  • 每次唤醒使用单独的硬件计时器。这无法扩展,因为硬件时间是有限的/有限的资源。
  • 对所有唤醒使用单个硬件计时器。实际上,计时器设置为 future 最早的唤醒。
  • 将硬件计时器设置为每 C 毫秒触发一次,并考虑在这些时间点进行唤醒。

有关准确的详细信息,您需要下载并阅读 OpenJDK 源代码以及操作系统的源代码。此外,对于不同版本的 Java 和不同版本的操作系统,详细信息可能会有所不同。

关于java - object.wait 和 Thread.sleep() 的 CPU 周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44741814/

相关文章:

java - 如何在java中的接口(interface)中使泛型参数可选?

java - 将图像预加载到变量中

c - 为什么 "env"的地址在顺序函数调用中不同?

c - 如何更改打印输出? (系统编程和C)

java - 显示从 json 响应中检索到的所有内容

java - 如何使用 jackson 将树 json 对象映射到 List<>

multithreading - 当使用来自 `fork` 创建的多个 C 线程的回调函数时,Rust Mutex 不工作

java - 如何使用 FutureTask 从 Runnable 接口(interface)返回值

java - JSP 中的 session 变量

multithreading - 操作系统是否知道应用程序线程?