对于等待和睡眠,CPU周期的行为如何不同。根据线程生命周期图很明显,如果调用Thread.sleep()或object.wait,则运行线程将被推入阻塞状态,在此阻塞状态下将不会使用CPU周期。
如果我是正确的,那么为什么没有任何机构提到这一点 Difference between wait() and sleep()
如果我错了,请纠正我。
另外,根据我的理解,当调用Thread.sleep(t)时,在时间t之后,生成中断信号以将此任务也用于下一个cpu周期。在object.wait()的情况下会发生什么?是否也为object.wait()生成了中断?
答案 0 :(得分:3)
如果我是正确的,那么为什么没有任何机构在wait()和sleep()
之间的区别中提到这一点
(你是对的。)
因为在两种情况下都是相同的并不是一个区别。 Q&您已经链接到询问sleep
和wait
之间的差异。
大概是因为您阅读的具体答案的作者认为它与他们所说的内容无关。或者因为他们认为这很明显。
另外,根据我的理解,当调用Thread.sleep(t)时,在时间t之后,生成中断信号以将此任务也用于下一个cpu周期。在object.wait()的情况下会发生什么?是否也为object.wait()生成了中断?
我认为你在这里讨论硬件中断,因为不涉及Java中断。
答案是比你想象的更复杂。用于终止Java sleep
和定时wait
调用的定时器可能会也可能不会使用硬件中断来实现。这是操作系统特定的。但如果它们是,我将期望操作系统以相同的方式实现它们。 (因为功能要求非常相似)。
广泛的画笔实现将是这样的:
Java通过本机代码进行系统调用。系统调用请求:
立即或稍后,操作系统线程调度程序将其调度到核心并运行该线程。
InterruptedException
,要么尝试重新获取互斥锁,等等。后者可能会再次阻止。OS 可以通过多种方式实现“在N”毫秒后唤醒。一些策略是:
有关详细信息,您需要下载并阅读OpenJDK源代码和操作系统源代码。此外,对于不同版本的Java和不同版本的操作系统,细节可能会有所不同。
答案 1 :(得分:0)
关于CPU线程状态的问题在你的链接上得到了解答 - wait()和sleep()都阻止了这个线程 - 所以我只回答你的最后一段。
当你调用Thread.sleep(t)时,线程只是在时间t之后继续执行;不抛出Java InterruptedException,并且未设置线程的中断状态。如何在虚拟机和硬件级别处理此问题,以及涉及多少CPU周期(取决于特定平台和虚拟机实施)。
如果在线程上调用Thread.interrupt(),Thread.sleep()和Object.wait()都会抛出InterruptedException。