2

Thread.yield()有人可以解释方法和Thread.sleep()方法之间的区别吗?

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

4

3 回答 3

11

这取决于您使用的 Java 版本,根据这个

在 Java 5 中,Thread.yield()调用 Windows API Sleep(0)。这具有清除当前线程的量子(分配的 CPU 时间片数)并将其置于队列末尾以获取其优先级的特殊效果。换句话说,所有具有相同优先级(以及更高优先级)的可运行线程将有机会在产生的线程下一次给定 CPU 时间之前运行。当它最终被重新调度时,它将返回一个完整的量程,但不会“结转”任何剩余的量程,从让步时开始。这种行为与非零睡眠略有不同,在非零睡眠中,睡眠线程通常会丢失 1 个量子值(实际上是 10 或 15 毫秒滴答的 1/3)。

在 Java 6 中,这种行为发生了变化。Hotspot VM 现在 Thread.yield()使用 Windows SwitchToThread()API 调用来实现。此调用使当前线程放弃其当前时间片,但不放弃其整个时间片。这意味着根据其他线程的优先级,屈服线程可以在稍后的一个中断周期内重新调度。


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

于 2013-02-24T02:59:17.643 回答
0

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

于 2013-02-24T02:59:32.697 回答
-1

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

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

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

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

于 2013-02-24T03:01:59.623 回答