能。调用 Thread.yield() 后,当前线程一定从运行态进入就绪态,JVM 规范保证该状态变更即时可靠;它不阻塞、不释放锁、不抛异常,但调度器可能立即再次选中该线程。

能。调用 Thread.yield() 后,当前线程一定会从运行态(Running)进入就绪态(Runnable),这是 JVM 规范明确保证的行为。
yield 之后的状态变化是确定的
不同于 sleep 或 wait,yield 不涉及阻塞或等待条件,它只是向调度器发出一个“让出 CPU”的提示。JVM 会立即把该线程状态设为就绪态,放入就绪队列,不再占用 CPU 时间片。
- 线程不会进入 Blocked、Waiting 或 Timed Waiting 状态
- 不会释放已持有的 synchronized 锁
- 不会抛出 InterruptedException
- 状态变更由 JVM 内部同步完成,无需操作系统介入,因此是可靠且即时的
但“进入就绪态”不等于“放弃执行权”
就绪态只是表示线程已准备好被调度,不代表它立刻停止运行或不再被选中:
- 调度器可能在下一轮调度中再次选中它(尤其在单核、低负载或无其他就绪线程时)
- 它只对同优先级或更高优先级的就绪线程构成“让出”机会,低优先级线程不受影响
- 调度器可完全忽略 yield 提示——这属于合法行为,但状态仍已切换到就绪
和 sleep 的关键区别
对比 sleep(1),就能看清 yield 的确定性:
立即学习“Java免费学习笔记(深入)”;
- sleep(1):线程进入 Timed Waiting,至少挂起约 1 毫秒,期间绝不会被调度
- yield():线程立即变为 Runnable(就绪),下一纳秒就可能被重选——状态变更是确定的,执行结果却是不确定的
实际编码中要注意什么
不要用 yield 控制逻辑顺序或实现同步,它不是同步工具:
- 不能替代 volatile、synchronized 或 Lock
- 不适用于需要“让出并等待某条件”的场景
- 仅适合调试、压力测试或极少数需主动降低线程抢占倾向的场合(如自旋等待优化)
- 现代 JVM 和操作系统调度器对 yield 的响应越来越弱,效果常不如预期


















