2012-12-22 3 views
1

나는 주사위를 굴리고 새 스레드를 사용하여 이미지를 업데이트하고 다시 칠하는 프로그램을 사용합니다. 여기에 내 코드 내 다른 클래스에서Java 객체 동기화, 대기 및 알림

public int roll() 
{ 
    new Thread(
    new Runnable() { 
     public void run() { 
     synchronized(o) { 
      o.notify(); 
      for (int i = 0; i < 10; i++) { 
      image = randomImage(); 
      repaint(); 
      try { 
       Thread.sleep(100); 
      } 
      catch(InterruptedException ex) { 
       System.out.println("InterruptedException caught"); 
      } 
      } 
     } 
     } 
    } 
).start(); 

    synchronized(o) { 
    try { 
     o.wait(); 
    } 
    catch(InterruptedException ex) { 
     System.out.println("InterruptedException caught"); 
    } 
    } 
    return rolled; 
} 

, 내가 가진 :

int rolled = dicePanel.roll(); 
label.setText("Rolled a + rolled"); 

문제는 동기화 현재의 코드로, 주사위 이미지가 애니메이션 없지만, 올바른을 반환 않는다는 것입니다 int를 압연했다. 동기화 된 코드가 없으면 이미지가 애니메이션되지만 롤 메서드는 다른 스레드가 끝내지 못하도록 0을 int로 반환합니다.

매번 이미지 코드를 반복하고 다시 칠할 수있는 방법이 있습니까? 스레드가 int 롤백을 완료 할 때까지 기다려야합니까?

+0

첫 번째 의견 - 'o'에 방금 잠금을 설정하고 얼마 동안 유지하려는 경우 'o.notify()'를 호출하는 데 많은 목적을 볼 수 없습니다. –

답변

0

이것은 지나치게 복잡한 해결책처럼 보입니다. EDT 이외의 스레드에서 주사위 롤링/이미지 업데이트를 확실히 수행해야하지만,이 작업을 두 개의 별도 스레드로 분할 할 필요는 없습니다.

당신의 주사위 이미지로 피딩을 한 다음, 그 작업이 끝나면 라벨에 선택한 주사위 값을 설정할 수 있습니다 (아마도 이미지에서도 가능할 것입니다).

+0

주사위 이미지가 반복 된 후에 라벨을 설정했는데 왜 그렇게 생각하지 않았는지 확신 할 수 없습니다. 감사 –

0

run() 방법 끝 부분에 o.notify();을 넣으십시오. Btw. notifyAll()을 사용하는 것이 좋습니다. 또는 Future 오브젝트 패턴을 유용하게 사용할 수 있습니다. 여기에 관한 기사입니다 http://www.vogella.com/articles/JavaConcurrency/article.html

또는 스윙 응용 프로그램을 개발하는 경우 SwingWorker으로 보입니다. 그러나 SwingWorker는 아마도이 작업을 위해 과도한 작업 일 것입니다.

대기 & 알림은 상당히 낮은 수준의 API이며 Java에서 동시성 작업을위한 많은 좋은 추상화가 있습니다.

+0

SwingWorker는 미래의보다 복잡한 프로그램에 대해 흥미로운 것으로 보입니다. –