這是一段經典的 Java 多線程範例,模擬《龜兔賽跑》寓言。兔子速度是烏龜的 5 倍,但休息時間長 10 倍。程式使用 wait()/notifyAll() 實現兩條線程的同步起跑,並透過 Thread.sleep() 模擬跑步與休息。
lock 與計數器 ready。main() 建立兩個 Runnable 實例(TortoiseRace、RabbitRace),啟動線程。ready == 2,確保兩選手進入等待狀態。lock.notifyAll() 發令槍響。run() 中先同步增加 ready,隨即 lock.wait() 等待發令。Thread.sleep(1) 模擬單位時間。ready 並 wait()。Thread.sleep(10) 模擬較長休息。// 主線程等待兩選手就緒
while (ready < 2) {
Thread.sleep(1);
}
synchronized (lock) {
lock.notifyAll(); // 同時喚醒烏龜與兔子
}
選手線程:
synchronized (T.lock) {
T.ready++;
T.lock.wait(); // 釋放鎖並進入等待集合
}
這確保了「同時起跑」的語義,避免其中一個線程搶跑。
烏龜跑了1 米! 兔子跑了5米! 烏龜跑了1 米! ... 烏龜已經跑完了比賽路程! 兔子跑完了比賽路程!
由於兔子單位時間跑 5 米但休息 10 倍,烏龜以均速 1 米/單位時間最終獲勝,呼應寓言寓意。
CountDownLatch 或 CyclicBarrier 替代手動 ready 計數,語義更清晰。