【问题标题】: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() 之间的区别中提到这一点
(你是对的。)
因为在这两种情况下都相同,所以没有区别。您已链接的问答链接中询问sleep 和wait 之间的差异。
大概是因为您阅读的特定答案的作者认为这与 他们 所说的内容无关。或者因为他们认为这是显而易见的。
另外,根据我的理解,当调用 Thread.sleep(t) 时,在时间 t 之后,会生成中断信号以考虑这个任务也用于下一个 cpu 周期。在 object.wait() 的情况下会发生什么? object.wait()是否也产生了中断?
我假设您在这里谈论的是硬件中断,因为不涉及 Java 中断。
答案是它比你想象的要复杂得多。用于终止 Java sleep 和定时 wait 调用的计时器可能会或可能不会使用硬件中断来实现。那是特定于操作系统的。但如果是,我会期望操作系统以相同的方式实现它们。 (因为功能要求非常相似)。
广泛的画笔实现是这样的:
-
Java 通过本机代码进行系统调用。系统调用请求:
- N 毫秒后唤醒我,或者
- 收到通知或 N 毫秒后唤醒我
- 操作系统安排“唤醒”时间为 N 毫秒
- 操作系统将本机线程标记为阻塞
-
大约 N 毫秒后,操作系统计时器(或其他)解除对本机线程的阻塞;即它变得可运行
-
立即或稍后某个时间,操作系统线程调度程序将其调度到核心并运行线程。
- 为了睡眠,Java 线程只是运行
- 对于定时等待,Java 运行时要么生成并抛出
InterruptedException,要么尝试重新获取互斥锁等。后者可能会再次阻塞。
操作系统可以通过多种方式实现“N 毫秒后唤醒”。一些策略是:
- 为每次唤醒使用单独的硬件定时器。这无法扩展,因为硬件时间是有限/有限的资源。
- 对所有唤醒使用单个硬件定时器。实际上,定时器是为未来最早的唤醒设置的。
- 将硬件计时器设置为每 C 毫秒触发一次,并考虑在这些时间点唤醒。
有关详细信息,您需要下载并阅读 OpenJDK 源代码和操作系统的源代码。此外,不同版本的 Java 和不同版本的操作系统,细节可能会有所不同。