Thread.yield()和Thread.sleep()之间的区别

ASi*_*ngh 2 java multithreading synchronization thread-safety

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

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

syb*_*0rg 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版本,都会将当前线程挂起指定的时间.

  • 如果您要复制其他人的话,请务必引用它们并添加适当的归属.我在上面的回答中做到了这一点. (2认同)