2012-11-18 50 views
0

我有一個程序(AWT框架,是的,我知道Swing更好,但我受限於使用它)有2個移動對象。所以我想我會把它們放在它自己的線程中讓對象以不同的速度移動等。在java中使用併發線程

一個線程(gameThread)處理彈跳球,另一個線程(cannonThread)處理屏幕上繪製的加農炮和它射出的射彈。我不確定如何分開球的速度和射彈的速度,這就是爲什麼我認爲2線程可以工作(通過使用thread.sleep(speedofobject))。

我不知道如何實現它們,我的隨機猜測(顯然)沒有奏效。屏幕上沒有顯示任何內容,編譯時也沒有產生錯誤。以前,球會出現在屏幕上,並且應該像它一樣移動。

這裏是我嘗試做多個線程的片段。如果您需要更多信息,請告訴我,我會發布。

public void start() 
{ 
    if (gameThread == null) 
    { 
     gameThread = new Thread(this); 
     gameThread.start(); 
    } 
    if (cannonThread == null) 
    { 
     cannonThread = new Thread(this); 
     cannonThread.start(); 
    }  
} 

public void run() 
    { 
     //thread for the ball, collision detection and scorekeeping 
     if (Thread.currentThread().equals(gameThread)) 
     { 
      Thread.currentThread().setPriority(Thread.MAX_PRIORITY); 
      while (!kill) 
      { 
       if (!paused) 
       { 
        target.repaint(); 
       } 
       try 
       { 
        Thread.sleep(ballSpeed); 
       } 
       catch(InterruptedException e){System.err.println("Interrupted.");} 
      } 
      stop(); 
     } 

     //thread for the cannon and projectile 
     if (Thread.currentThread().equals(cannonThread)) 
     { 
      Thread.currentThread().setPriority(Thread.NORM_PRIORITY); 
      if (!paused) 
      { 
       if (projectileFiring) 
       { 
        cannon.repaint(); 
       } 
       try 
       { 
        Thread.sleep(projectileSpeed); 
       } 
       catch(InterruptedException e){System.err.println("Interrupted.");} 
      } 
     } 
    } 

回答

0

對於你的世界中的每個物體都有一個單獨的線程是不可行的。解決這個問題的方法之一是有一個單獨的線程負責更新「世界模型」(在你的情況下,球和大炮)。這個世界模型線程將運行下面的動畫循環:

  1. 睡眠時間很短
  2. 更新表示基於當前時間
  3. 信號,即用戶界面需要被更新球和大炮的數據當前模型

請注意,使用此方法時,您需要同步對模型數據的訪問,因爲它將由一個線程中的動畫循環更新並由渲染代碼讀取以更新UI。您不希望數據在您閱讀時發生變化。

+0

這是一個很好的觀點,所以只需要一個'updateBall'和'updateCannon'而不是每個線程。唯一我非常想知道的是如何獨立測量彈丸和球的速度。我使用'thread.sleep(value)'作爲球的速度,其中一個較小的'value'會使它移動得更快,反之亦然。有沒有一種好的方法可以在不使用'thread.sleep()'的情況下做到這一點,或者在一個線程中使用兩種對象的技巧? – zakparks31191

+0

@ZakParks - 爲需要跟蹤的各種速度保持單獨的變量。保持某些標準單位的速度(例如像素/秒)。將相關速度乘以前一次更新所用的時間,以確定要應用的位移。這樣,您的視覺速度將受到速度變量的直接控制,而不是基於動畫循環時間而變化。 –

+0

對我有意義,謝謝 – zakparks31191