Thread.yield()是静态方法,建议当前线程让出CPU给同优先级就绪线程,不释放锁、不阻塞、不改变RUNNABLE状态,行为依赖JVM和系统调度,不可用于同步或等待条件。

Thread.yield() 是一个静态方法,用于向线程调度器“建议”当前线程主动让出 CPU,以便同优先级的其他就绪线程有机会运行。注意:它只是建议,不保证一定会让出,也不影响线程状态(调用后线程仍处于 RUNNABLE 状态)。
yield() 的作用和典型使用场景
它适用于希望在逻辑上“礼貌地”交出执行权、避免忙等(busy-waiting)或实现轻量级协作式调度的场合。例如:
- 自旋等待中检测到条件尚未满足,但不想持续占用 CPU
- 多个同优先级线程协同处理任务,希望轮流执行以提升公平性
- 调试或教学中模拟线程调度行为(生产环境慎用)
yield() 不等于 sleep() 或 wait()
它与其它让出控制权的方法有本质区别:
- 不释放锁:yield() 不会释放任何已持有的 monitor 锁(synchronized 块/方法中的锁)
- 不阻塞线程:线程不会进入 WAITING 或 TIMED_WAITING 状态,仍可被立即重新调度
-
无时间参数:不像
Thread.sleep(1)那样指定最小暂停时长,也不像Object.wait()需要配合 synchronized 和 notify
实际使用注意事项
由于 yield() 行为高度依赖 JVM 实现和底层操作系统调度策略,使用时需特别注意:
立即学习“Java免费学习笔记(深入)”;
- 在单核 CPU 或线程数远少于 CPU 核心数时,yield() 可能几乎无效(调度器可能立刻再次选中该线程)
- 不同 JVM(如 HotSpot、OpenJ9)对 yield() 的实际处理可能不同,甚至某些版本将其编译为空操作
- 不要用它来实现同步逻辑(如替代锁或 volatile),它不具备内存可见性保障
- 若目标是“等待某条件成立”,应优先使用
LockSupport.park()/unpark()、Condition或BlockingQueue等更可靠的机制
简单示例(仅作演示)
以下代码展示两个同优先级线程交替打印,借助 yield() 增加切换概率(但不保证):
public class YieldExample {
public static void main(String[] args) {
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();
}
}
输出顺序不确定,可能交错,也可能连续 —— 这正是 yield() “建议而非强制”的体现。


















