2012-11-02 81 views
1

我正在研究一個關於多球彈跳的學校項目。到目前爲止,我設法創建了應用程序,一切正常。但是,我也需要在應用程序中實現多線程,這就是我被卡住的地方。我在想一球一線,但我不確定如何實現它。這是到目前爲止我的代碼(部分):多線程多球遊戲

public void paintComponent(Graphics g) 
     { 
      super.paintComponent(g); 

      //The balls are painted only after the timer is started 
      if(bTimer) 
      { 
       for(Ball ball:ballList.ballsArrayList) 
       { 
        Thread ballThread = new Thread(ball); 
        ballThread.start(); 
        ball.draw(g); 

        /*other code for moving the ball*/ 
       } 
      } 
     } 

在Ball類:

 public void draw(Graphics g) { 
      Color color = new Color(this.getColorR(),this.getColorG(),this.getColorB()); 
      g.setColor(color); 
      int radius = this.getsize(); 
      g.fillOval((int)(this.getX() - radius), (int)(this.getY() - radius), (int)(2 *  
      radius), (int)(2 * radius)); 

     } 

    public void run() { 

      String name = Thread.currentThread().getName(); 

      for (int i = 0; i < 200; i++) { 

       //ball.draw(g); ?? 

       try { 
        Thread.sleep(50); 
        System.out.println("Sleeping"); 
       } catch (Exception ex) {} 
      } 
     } 

我在想,我可以把ball.draw()函數中的run()函數線程。但我不知道我該怎麼做,或者如果這是一個好主意。多線程仍然是我很難理解和貫徹=((

+0

每個線程有一個球肯定是一個矯枉過正。你可以有數千個球!只需在一個線程中按順序處理所有球。 – Vlad

+0

不是擺動(按設計)總是多線程? – Burkhard

+1

無論如何,請不要將您的業務邏輯放入繪圖函數!您需要分離管理球的業務邏輯,包含所有物理的模型以及僅顯示結果的UI。 – Vlad

回答

2

不是一個真正的答案,但太長加入了註釋。

你應該注意到,Swing是線程安全的。所有Swing組件都應該在Event Dispatch Thread上訪問,並且僅在該線程上訪問。請參閱Concurrency in Swing指南瞭解更多信息。

這意味着每個球可以有一個線程更新球的位置,如果您在繪畫過程中訪問球的位置,則此訪問發生在EDT上,意味着您無法更新球的位置l隨時在後臺線程中。您將不得不實施一些鎖定或者僅更新EDT上的位置。

我不確定你想達到什麼目的,但是如果你只是想在特定的時間間隔更新球的位置,我會選擇javax.swing.Timer。該定時器在EDT上觸發,允許您以線程安全的方式更新位置。 Swing wiki標籤包含一些用於在Swing中實現動畫的更多鏈接。

+0

我已經在使用Timer來更新球的位置。而且我還認爲每個球的一根線可能有點太多,因爲像弗拉德上面所說的那樣,一千個球=一千個線程!但是,這個問題是要求多線程,這讓我對接下來要做什麼感到困惑。我會檢查你給我的鏈接。謝謝!! – user1719821

1

所有的搖擺碼必須在event dispatching thread上運行。因此,你在代碼片段中所做的是不好的。然而,如果計算球的位置是cpu密集型並且需要時間,那麼您確實希望將邏輯移動到單獨的線程中,否則您的UI將無響應。

這將成爲典型的producer/consumer problem:一個線程產生cooridnates,並且事件分派線程通過繪製球來消耗它們。