object.wait和Thread.sleep()

时间:2017-06-24 23:20:22

标签: java multithreading operating-system

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

如果我是正确的,那么为什么没有任何机构提到这一点 Difference between wait() and sleep()

如果我错了,请纠正我。

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

2 个答案:

答案 0 :(得分:3)

  

如果我是正确的,那么为什么没有任何机构在wait()和sleep()

之间的区别中提到这一点

(你是对的。)

  1. 因为在两种情况下都是相同的并不是一个区别。 Q&您已经链接到询问sleepwait之间的差异

  2. 大概是因为您阅读的具体答案的作者认为它与他们所说的内容无关。或者因为他们认为这很明显。

  3.   

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

    我认为你在这里讨论硬件中断,因为不涉及Java中断。

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

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

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

      • 在N毫秒后叫醒我,或
      • 通知时或在N毫秒后叫醒我
    2. 操作系统安排“唤醒”N毫秒时间
    3. 操作系统将本机线程标记为已阻止
    4. 大约 N毫秒之后,OS计时器(或其他)取消阻塞本机线程;即它变得可以运行
    5. 立即或稍后,操作系统线程调度程序将其调度到核心并运行该线程。

      • 睡眠时,Java线程只运行
      • 对于定时等待,Java运行时要么生成并抛出InterruptedException,要么尝试重新获取互斥锁,等等。后者可能会再次阻止。
    6. OS 可以通过多种方式实现“在N”毫秒后唤醒。一些策略是:

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

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

答案 1 :(得分:0)

关于CPU线程状态的问题在你的链接上得到了解答 - wait()和sleep()都阻止了这个线程 - 所以我只回答你的最后一段。

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

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