2012-11-02 5 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*/ 
       } 
      } 
     } 

: 여기 내 코드 (일부)까지입니다

 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() 함수를 넣을 수 있다고 생각했다 실. 그러나 나는 그것을 어떻게 할 수 있는지 또는 그것이 좋은 생각인지는 모른다. 나를 이해하고 = ((

+0

스레드 당 하나의 공이있는 것은 확실히 과잉입니다. 수천 개의 볼을 가질 수 있습니다! 하나의 스레드에서 모든 볼을 순차적으로 처리하십시오. – Vlad

+0

디자인 상 스윙이 항상 다중 스레드되지 않습니까? – Burkhard

+1

어쨌든, 비즈니스 로직을 페인트 기능에 넣지 마십시오! 볼을 관리하는 비즈니스 로직, 모든 물리를 포함하는 모델, 결과 만 표시하는 UI를 분리해야합니다. – Vlad

답변

2

아니 진짜 대답을 구현하지만, 너무 오래 코멘트에 넣어하는 멀티 스레딩은 여전히 ​​어렵다.

당신은 스윙 입니다주의해야하지 스레드 안전합니다. 모든 스윙 컴포넌트는 이벤트 발송 쓰레드에 접근하고, 해당 스레드에서만. 자세한 내용은 Concurrency in Swing 설명서를 참조해야한다.

이 당신이 볼의 위치를 ​​업데이트 볼 당 하나 개의 스레드를 가질 수 있다는 것을 의미한다. 그러나, 페인팅 중에 볼의 위치에 접근하면 EDT에서이 액세스가 발생합니다. 즉, 발의 위치를 ​​업데이트 할 수 없음을 나타냅니다. 언제든지 백그라운드 스레드에 있습니다. 일부 잠금을 구현하거나 단순히 EDT의 위치를 ​​업데이트해야합니다.

나는 당신이 달성하려고하는 것이 확실하지 않지만 특정 시간 간격으로 공의 위치를 ​​간단히 업데이트하고자한다면 javax.swing.Timer을 선택할 것입니다. 이 타이머는 EDT에서 트리거되므로 스레드로부터 안전한 방식으로 위치를 업데이트 할 수 있습니다. Swing wiki 태그에는 Swing에서 애니메이션을 구현하기위한 몇 가지 링크가 있습니다.

+0

나는 이미 공의 위치를 ​​업데이트하기 위해 타이머를 사용하고있다. 그리고 블라드 (Vlad)가 말했듯이, 천볼 (천 개) = 천 개가 있기 때문에 공당 하나의 실이 너무 많이있을 것이라고 생각했습니다! 그러나 질문은 멀티 스레딩을 요구하고 있었고 다음에해야 할 일에 대해 혼란스러워했습니다. 네가 준 링크를 확인해 보겠다. 감사!! – user1719821

1

모든 스윙 코드는 event dispatching thread에서 실행되어야합니다. 따라서 코드 스 니펫에서 수행중인 작업은 좋지 않습니다.

하지만 볼 위치 계산에 CPU 사용량이 많이 소요되고 시간이 필요한 경우 별도의 스레드에서 로직을 이동해야합니다. 그렇지 않으면 UI가 응답하지 않게됩니다.

이것은 보통 producer/consumer problem이됩니다. 하나의 스레드가 cooridnate를 생성하고 이벤트 발송 스레드가 공을 그려 소비합니다.