【问题标题】:CPU cycle for object.wait and Thread.sleep()object.wait 和 Thread.sleep() 的 CPU 周期
【发布时间】:2017-11-28 05:40:59
【问题描述】:

等待和睡眠的 CPU 周期行为有何不同。根据 Thread 生命周期图,很明显如果调用 Thread.sleep() 或 object.wait,正在运行的线程将被推入阻塞状态,在此阻塞状态期间不会占用 CPU 周期。

如果我是对的,那么为什么没有任何机构在 Difference between wait() and sleep()

如果我错了,请纠正我。

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

【问题讨论】:

    标签: java multithreading operating-system


    【解决方案1】:

    关于 CPU 线程状态的问题已在您的链接中得到解答 - wait() 和 sleep() 都会阻塞线程 - 所以我只会回答您的最后一段。

    当你调用 Thread.sleep(t) 时,线程只是在时间 t 之后继续执行;没有抛出 Java InterruptedException 并且没有设置线程的中断状态。如何在虚拟机和硬件级别进行处理,以及涉及多少 CPU 周期(如果有)取决于特定平台和虚拟机实现。

    如果在线程上调用 Thread.interrupt(),Thread.sleep() 和 Object.wait() 都会抛出 InterruptedException。

    【讨论】:

      【解决方案2】:

      如果我是对的,那么为什么没有人在 Wait() 和 sleep() 之间的区别中提到这一点

      (你是对的。)

      1. 因为在这两种情况下都相同,所以没有区别。您已链接的问答链接中询问sleepwait 之间的差异

      2. 大概是因为您阅读的特定答案的作者认为这与 他们 所说的内容无关。或者因为他们认为这是显而易见的。

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

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

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

      广泛的画笔实现是这样的:

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-05-28
        • 1970-01-01
        • 1970-01-01
        • 2022-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-08
        相关资源
        最近更新 更多