【问题标题】:What's the difference between Thread.yield() and Thread.sleep(0) in Java? [duplicate]Java 中的 Thread.yield() 和 Thread.sleep(0) 有什么区别? [复制]
【发布时间】:2011-06-17 04:18:16
【问题描述】:

可能重复:
Are Thread.sleep(0) and Thread.yield() statements equivalent?

据我了解,Thread.yield() 和 Thread.sleep(0) 都应该让 CPU 通过某种调度算法重新判断运行哪个线程。

区别在于:

  1. Thread.yield() 是给其他线程执行机会,但Thread.sleep(0) 不会,它只会告诉CPU 你应该重新安排执行线程,包括当前线程本身。

  2. Thread.yield() 只是一个建议,这意味着它可能根本不被接受,但 Thread.sleep(0) 会强制重新排列。

以上两个结论对吗?

【问题讨论】:

  • 由于这些方法非常依赖于实现,所以很难说。您不应依赖这些方法的行为。例如,如果您有一个只执行 Thread.yield() 的循环,它不会在 99% 以上的时间内放弃 CPU。 Thread.sleep(0) 可能会休眠 0.5 到 2 毫秒,具体取决于操作系统,放弃 CPU,但这也不能保证。

标签: java multithreading sleep yield


【解决方案1】:

Thread.Sleep() 的开销稍大一些,因为它创建了一个包含某种计时器的系统,该计时器将唤醒进程。 (基本上取决于实施)
最后它会调用Yield()

Thread.Yield()只会放弃轮到线程,并在下一轮获得它。

Thread.Sleep(0) 可能有一个优化,只调用yield。 (再次,实施)

【讨论】:

    【解决方案2】:

    Thread.sleep() 只会暂停线程而不放弃控制权。 Thread.yield() 将暂停线程并允许其他线程运行。如果没有线程需要,原线程将立即恢复。

    【讨论】:

    • 错了,我想。 Thread.sleep() 将使线程脱离运行状态,并允许调度程序将另一个可运行线程切换为运行(Thread.yield() 也是如此)。但是,线程确实保留了它持有的任何锁。
    猜你喜欢
    • 2011-02-26
    • 1970-01-01
    • 2010-11-27
    • 2013-02-06
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    相关资源
    最近更新 更多