Thread.yield()
有人可以解释方法和Thread.sleep()
方法之间的区别吗?
我是如何理解的:Thread.yield()
将监视器锁放弃给 JVM 决定接下来执行的其他线程,Thread.sleep()
并将当前线程置于睡眠模式给定的毫秒数,而不会放弃监视器锁。
Thread.yield()
有人可以解释方法和Thread.sleep()
方法之间的区别吗?
我是如何理解的:Thread.yield()
将监视器锁放弃给 JVM 决定接下来执行的其他线程,Thread.sleep()
并将当前线程置于睡眠模式给定的毫秒数,而不会放弃监视器锁。
这取决于您使用的 Java 版本,根据这个:
在 Java 5 中,
Thread.yield()
调用 Windows APISleep(0)
。这具有清除当前线程的量子(分配的 CPU 时间片数)并将其置于队列末尾以获取其优先级的特殊效果。换句话说,所有具有相同优先级(以及更高优先级)的可运行线程将有机会在产生的线程下一次给定 CPU 时间之前运行。当它最终被重新调度时,它将返回一个完整的量程,但不会“结转”任何剩余的量程,从让步时开始。这种行为与非零睡眠略有不同,在非零睡眠中,睡眠线程通常会丢失 1 个量子值(实际上是 10 或 15 毫秒滴答的 1/3)。在 Java 6 中,这种行为发生了变化。Hotspot VM 现在
Thread.yield()
使用 WindowsSwitchToThread()
API 调用来实现。此调用使当前线程放弃其当前时间片,但不放弃其整个时间片。这意味着根据其他线程的优先级,屈服线程可以在稍后的一个中断周期内重新调度。
Thread.sleep()
无论您使用什么 Java 版本,都将当前线程挂起指定时间。
Thread.sleep() 让你的线程休眠一段时间或直到被中断。Thread.yield() 不会让你的线程进入睡眠状态。相反,它只是暂时暂停线程,让其他线程完成它们的工作。
关。Thread.sleep 使线程休眠指定的时间,但不放弃锁。
Thread.yield 也不会放弃锁。它只是提示线程调度程序给另一个线程一些周期。
他们真的一点都不像,他们是非常不同的。
您是否正在尝试解决某个特定问题?