Thread.yield() 是一個靜態方法,作用是讓當前正在執行的線程從「運行狀態」回到「就緒狀態」,讓出 CPU 執行權給相同優先級的其他線程。但不保證其他線程一定會獲得執行權,當前線程也可能立即再次被調度繼續執行。
class ThreadA extends Thread {
public ThreadA(String name) { super(name); }
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.printf("%s [%d]:%d%n", getName(), getPriority(), i);
if (i % 4 == 0) Thread.yield(); // 每 4 次讓步
}
}
}
public class YieldTest {
public static void main(String[] args) {
new ThreadA("t1").start();
new ThreadA("t2").start();
}
}
t1 [5]:0
t2 [5]:0
t1 [5]:1
t1 [5]:2
t1 [5]:3
t1 [5]:4
...
可見 t1 在 i=0 調用 yield() 後,t2 並未立即搶佔 CPU,t1 繼續執行。這證明 yield() 僅是「建議」讓步,調度器不一定會切換線程。
| 特性 | yield() | wait() |
|---|---|---|
| 狀態轉換 | 運行 → 就緒 | 運行 → 等待(阻塞) |
| 釋放鎖 | 否 | 是 |
| 喚醒方式 | 調度器重新選擇 | notify()/notifyAll() |
public class YieldLockTest {
private static final Object LOCK = new Object();
static class ThreadA extends Thread {
@Override public void run() {
synchronized (LOCK) {
for (int i = 0; i < 10; i++) {
System.out.printf("%s [%d]:%d%n", getName(), getPriority(), i);
if (i % 4 == 0) Thread.yield();
}
}
}
}
public static void main(String[] args) {
new ThreadA("t1").start();
new ThreadA("t2").start();
}
}
輸出顯示 t1 完整執行完 0~9 後 t2 才開始,證明 yield() 期間 t1 持有鎖,t2 無法進入同步區塊。