【问题标题】:Difference between Thread.yield() and Thread.sleep() [duplicate]Thread.yield() 和 Thread.sleep() 之间的区别 [重复]
【发布时间】:2013-02-24 02:55:42
【问题描述】:

有人能解释一下Thread.yield() 方法和Thread.sleep() 方法的区别吗?

我的理解是:Thread.yield() 将监视器锁放弃给 JVM 决定下一步执行的其他线程,Thread.sleep() 将当前线程置于休眠模式给定的毫秒数,而不会放弃监视器锁。

【问题讨论】:

  • “Thread.yield() 放弃了监视器锁”。不,它没有。你是从哪里得到这个想法的?
  • 我只是想知道...如果 Thread.yield 不放弃监视器的锁..den 如果其他线程具有高优先级,任何其他线程如何继续执行..?
  • 另外,如果一个线程进入睡眠状态是否有可能......其他线程可能会继续执行......我的意思是其他线程可能会获得监视器锁并继续执行以及当线程唤醒时..它再次锁定...我仍然很困惑。
  • 为什么会被标记为重复?链接的问题是关于 .NET 的,而这是关于 Java 的,完全不同的故事!

标签: java multithreading synchronization thread-safety


【解决方案1】:

这取决于你使用的Java版本,根据this

在 Java 5 中,Thread.yield() 调用 Windows API Sleep(0)。这有 清除当前线程的量子的特殊效果(数量 分配的 CPU 时间片)并将其放在队列的末尾 为其优先级。换句话说,所有可运行线程 相同优先级(以及更高优先级)将有机会运行 在产生的线程下一次给定 CPU 时间之前。几时 最终重新安排,它会以一个完整的量子回来,但是 从 屈服。这种行为与非零睡眠有点不同 睡眠线程通常会丢失 1 个量子值(实际上, 10 或 15 毫秒滴答声的 1/3)。

在 Java 6 中,此行为已更改。 Hotspot VM 现在实现 Thread.yield() 使用 Windows SwitchToThread() API 调用。这 call 使当前线程放弃其当前时间片,但不 它的整个量子。这意味着根据优先级 其他线程,屈服线程可以安排回一个 稍后中断。


Thread.sleep() 将当前线程挂起指定时间,无论您使用什么 Java 版本。

【讨论】:

  • 你的回答比我的要全面得多。荣誉。 :) 我怀疑其他操作系统也有你为 Windows 描述的差异。来自我的 +1。
  • 谢谢,在其他操作系统上,系统调用的效果是一样的,是的。
  • 如果您要复制他人的话,请务必引用他们并添加适当的署名。我已经在你上面的回答中做到了这一点。
【解决方案2】:

Thread.sleep() 让你的线程休眠一段时间或直到被中断。 Thread.yield() 不会让你的线程进入睡眠状态。相反,它只是暂时暂停线程,让其他线程完成它们的工作。

【讨论】:

    【解决方案3】:

    关闭。 Thread.sleep 使线程休眠指定时间,但不放弃锁。

    Thread.yield 也不会放弃锁。它只是提示线程调度程序给另一个线程一些周期。

    他们真的一点都不像,他们非常不同。

    您是否正在尝试解决某个特定问题?

    【讨论】:

    • 谢谢维克多。我是 JAVA 并发的初学者,所以我只想学习基础知识。
    • 我只是想知道...如果 Thread.yield 不放弃监视器的锁..den 如果其他线程具有高优先级,任何其他线程如何继续执行..?
    • 你为什么认为线程持有锁?如果它持有锁,那么你是对的,它不会放弃锁。但它仍然会提示线程调度程序给其他线程一些周期。只是不要为这个锁设置等待。
    猜你喜欢
    • 2011-02-26
    • 2016-08-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 2011-07-06
    • 2021-03-08
    • 2014-08-16
    相关资源
    最近更新 更多