yield()方法主动让出CPU执行权但不释放锁、不进入阻塞,仅提示调度器切换同优先级就绪线程,不保证切换成功,不可用于同步或等待条件。

yield() 方法的作用是主动让出当前线程的CPU执行权,但**不释放锁、不进入阻塞状态**,只是提示调度器“我愿意暂停一下”,由调度器决定是否切换到其他相同优先级的就绪线程。它不是强制切换,也不保证其他线程一定立即运行。
yield() 的基本用法
在 Java 中,Thread.yield() 是一个静态方法,调用后当前线程从“运行中(Running)”状态转为“就绪(Runnable)”状态,重新参与 CPU 竞争:
- 仅对相同优先级的线程有意义;低优先级线程不会被唤醒,高优先级线程会直接抢占
- 若没有其他同优先级线程处于就绪态,当前线程可能立刻被调度器再次选中,继续执行
- 不能用于线程同步或协调,也不替代 wait()/notify() 或 Lock 机制
典型适用场景
yield() 通常用在以下有限场合,需谨慎评估必要性:
- 自旋等待的轻量退让:比如忙等待循环中,避免持续空转消耗 CPU,可插入 yield() 让其他线程有机会执行
- 公平性微调:多个计算密集型线程协作时,人为插入 yield() 增加调度机会(但实际效果依赖 JVM 和 OS 调度策略)
- 调试与模拟调度行为:验证多线程逻辑在“可能让出”的情况下是否健壮
注意事项与常见误区
使用 yield() 容易陷入误解,需特别注意:
- 它不保证线程切换,JVM 可忽略该提示(尤其在单核或负载低时)
- 不释放任何锁,即使持有 synchronized 锁或 ReentrantLock,其他线程仍无法进入临界区
- 不要用它实现“等待某条件成立”,应改用 wait() + notify() 或 Condition.await()
- 现代 JVM 和操作系统调度已较成熟,多数场景下 yield() 并无实际收益,甚至可能降低性能
简单示例(仅作示意)
以下代码演示两个同优先级线程交替打印,但请注意:输出顺序仍不确定,yield() 不提供同步保障:
Thread t1 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("T1: " + i);
Thread.yield(); // 礼让,希望 T2 运行
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("T2: " + i);
Thread.yield();
}
});
t1.start(); t2.start();
实际运行中,可能连续输出多个 T1 或 T2,说明 yield() 并未强制切换。

















