2025-02-09

例如一個賽車遊戲,裡面有10輛車,我需要他們同時動起來,這個同時很重要,要求準確性非常高,因為隻有每輛臺車能同時開動,才算公平。

每輛車用一個線程表示,那麼,這10個線程如何保證“同時啟動、執行、喚醒…等等”的準確性呢?

請各位給出實現或思路,尤其是開發遊戲的javaeyer…
問題補充:
補充一下:

以下方法顯然不行:

Java代碼
new CarThread().start();  
new CarThread().start();  
new CarThread().start();  
…  

new CarThread().start();
new CarThread().start();
new CarThread().start();

有先後順序的話就保證不瞭準確性。

———-我要隔開我要隔開———-

aninfeel所回答的同樣有問題:

aninfeel 寫道
全部車子線程啟動後使用wait(),然後使用notifyAll大傢一起開動

Java代碼
class CarThread{    
   public void run()    
   {    
      //大傢一起在這裡等。    
      synchronized(waitObj){    
           waitObj.wait();    
      }    
      //開始比賽    
      ……….    
   }    
}    
//大傢一起跑    
waitObj.notifyAll();   
class CarThread{
   public void run()
   {
      //大傢一起在這裡等。
      synchronized(waitObj){
           waitObj.wait();
      }
      //開始比賽
      ……….
   }
}
 
//大傢一起跑
waitObj.notifyAll();

原因,Object.notifyAll()的javadoc說的很清楚。

javadoc 寫道

The awakened threads  will compete in the usual manner with any other threads that might  be actively competing to synchronize on this object; for example, the awakened threads enjoy no reliable privilege or disadvantage in being the next thread to lock this object.

采納的答案
2008-12-22 fjlyxx (中級程序員)
其實  你沒必要讓線程一起啟動,除非你有這麼多的CPU 理論上是不行的。

你在乎的就是時間,靠時間去判斷,你可以在線程啟動的時候設置一個開始時間,結束的時候一個結束時間。當然你的顯示方式要能欺騙玩遊戲的人。

——————————————————————————–
提問者對於答案的評價:
還是那一句,分隻能給一個。我閉著眼睛點“采納為答案”,點瞭好幾次才點中。

大傢給出的答案都very well…

也想通瞭為什麼賽車類的遊戲都是要倒數3秒才開始。。

其他回答
全部車子線程啟動後使用wait(),然後使用notifyAll大傢一起開動

Java代碼
class CarThread{  
   public void run()  
   {  
      //大傢一起在這裡等。  
      synchronized(waitObj){  
           waitObj.wait();  
      }  
      //開始比賽  
      ……….  
   }  
}  
//大傢一起跑  
waitObj.notifyAll();
那你隻能控制 10個線程 cup分配的運行時間瞭。

10個線程時間類。 規定在 多少多少毫秒內為一單位~

比如100毫秒。

哪麼100毫秒內,10個線程每個應分配得10豪秒的運行時間。

在100豪秒內,有個別線程占用的大部分CUP時間。所以你可以寫一個控制類
控制100毫秒內 每一條線程必須執行到10毫秒。才保證公平,
下一輪是另一個100毫秒開始。

如果你想高精確度的話 哪麼可以調當前的100毫秒時間單位,改成更小的時間。

樓上的回答是正確的, 但是沒有精確的東西。 除非你有32個CPU的系統, 哈哈啊哈

樓主應該先去研究下 java 的多線程,有點概念後再來討論就容易很多。我來幫 墓裡活人 解釋下。

首先, 從技術上來說,嚴格意義上的同時啟動是做不到的,除非你有多個cpu.
在大多數隻有一個cpu的電腦上, 微觀上同一時間內隻有一個線程能運行。 那個為瞭達到近似你所要求的效果,可以采用變通的方法。

舉例如下
你有10臺賽車,這次賽車一共要持續10分鐘。 但是隻有一個cpu就類似隻有一個賽道。 那怎麼辦呢? 可以每次每輛賽車跑10分鐘。 然後換車。

為瞭做的更平滑點,可以每次每輛車跑1分鐘,然後換車。

墓裡活人  的解釋就是這個意思。

不過在具體java 編程中,這個要求比較難實現, 因為java的線程調度的具體實現是依賴操作系統的。 我建議你可以換一種思路,就是每隔一分鐘挨個計算一下各個車的位置。這種做法應該更實際。

“每輛臺車能同時開動,才算公平” 是不現實的。因為實際上所謂的線程並發執行在微觀上也是每個線程分一個小時間片,一個一個順序執行。
換個角度,假設有一個方法可以同時啟動所有的線程,線程啟動後誰先執行也是由cpu決定。所以,所謂的公平應該是:各輛車啟動的間隔盡可能小,並且啟動順序是隨機的。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *