首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 多線程模擬龜兔賽跑:同步與協作機制解析

     編輯:Java 相關知識

程式碼概覽

這是一段經典的 Java 多線程範例,模擬《龜兔賽跑》寓言。兔子速度是烏龜的 5 倍,但休息時間長 10 倍。程式使用 wait()/notifyAll() 實現兩條線程的同步起跑,並透過 Thread.sleep() 模擬跑步與休息。

核心類別結構

主類 T

  • 持有共享鎖 lock 與計數器 ready。
  • main() 建立兩個 Runnable 實例(TortoiseRace、RabbitRace),啟動線程。
  • 主線程自旋等待 ready == 2,確保兩選手進入等待狀態。
  • 獲得鎖後呼叫 lock.notifyAll() 發令槍響。

烏龜線程 TortoiseRace

  • run() 中先同步增加 ready,隨即 lock.wait() 等待發令。
  • 獲釋後每 1 米輸出一次,Thread.sleep(1) 模擬單位時間。
  • 跑滿 1000 米結束。

兔子線程 RabbitRace

  • 同樣先增加 ready 並 wait()。
  • 每步 5 米,Thread.sleep(10) 模擬較長休息。
  • 同樣以 1000 米為終點。

關鍵同步細節

// 主線程等待兩選手就緒
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 計數,語義更清晰。
  • 將距離、速度、休息時間參數化,便於擴展。
  • 加入比賽結果判斷邏輯,輸出最終贏家。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved