2012-11-18 3 views
0

2 개의 움직이는 객체가있는 프로그램 (AWT 프레임, 예, Swing이 더 좋지만 사용이 제한되어 있음을 알고 있습니다)이 있습니다. 그래서 각기 다른 속도로 움직일 수 있도록 각 스레드를 각각의 스레드에 넣을 것입니다.자바에서 동시 스레드 사용

한 스레드 (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. 잠을 UI를 업데이트 할 필요가 있다고 현재 시간
    2. 신호에 따라 볼과 대포를 나타내는 데이터 현재 모델

    이 방법을 사용하면 모델 데이터에 대한 액세스를 동기화해야합니다. 하나의 스레드에서 애니메이션 루프에 의해 업데이트되고 렌더링 코드에 의해 UI가 업데이트되므로 모델 데이터에 대한 액세스를 동기화해야합니다. 데이터를 읽는 동안 데이터가 변경되는 것을 원하지는 않습니다.

  • +0

    좋은 점이 있습니다. 따라서 스레드 대신 updateBall과 updateCannon 만 있으면됩니다. 내가 커 큐어 스에 대해서만하는 것은 발사체와 볼의 속도를 독립적으로 측정하는 방법입니다. 나는 공의 속도로'thread.sleep (value)'를 사용하고 있었는데, 더 작은'value'는 더 빠르게 움직일 것이며, 그 반대도 마찬가지입니다. 'thread.sleep()'을 사용하지 않고이 작업을 수행하는 좋은 방법이 있습니까? 아니면 하나의 스레드에서 두 개의 객체에 대해 해당 메소드를 사용하는 더 멋진 방법입니까? – zakparks31191

    +0

    @ZakParks - 추적해야하는 다양한 속도에 대해 별도의 변수를 유지합니다. 몇 가지 표준 단위 (예 : 픽셀/초)로 속도를 유지합니다. 관련 속도를 이전 업데이트로부터의 경과 시간으로 곱하여 적용 할 변위를 결정합니다. 이렇게하면 시각적 인 속도가 애니메이션 루프 타이밍에 따라 달라지는 것이 아니라 속도 변수를 직접 제어 할 수 있습니다. –

    +0

    은 나에게 의미가 있습니다. 감사합니다. – zakparks31191