2012-12-22 79 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滾動。如果沒有同步代碼,圖像將生成動畫,但roll方法將返回0作爲整數,因爲它不會讓其他線程完成。

有什麼辦法讓圖像代碼循環遍歷並重新繪製每次,但是等到線程完成以返回int滾動?

+0

第一條評論 - 當你剛剛獲得'o'上的鎖並打算保留它一段時間時,我無法在調用'o.notify()'時看到很多目的。 –

回答

0

這看起來像一個過於複雜的解決方案。你當然應該在EDT以外的線程中執行你的骰子滾動/鏡像更新,但是你不需要把這個任務分成兩個獨立的線程。

只有一個線程可以與你的骰子圖像一起撥動,然後當它完成時,它可以在你的標籤(也可能在你的圖像中)中設置所選的骰子值。

+0

設置標籤後,骰子圖像循環工作,不知道爲什麼我沒有想到這一點。謝謝 –

0

o.notify();置於run()方法的末尾。順便說一句。使用notifyAll()應該是優選的。或者您可能會發現有用的對象模式。這裏是一篇關於它的文章http://www.vogella.com/articles/JavaConcurrency/article.html

或者如果你正在開發Swing應用程序請看SwingWorker。但是,SwingWorker對於這項任務可能是過度的。

等待&通知是相當低級別的API,並且Java中有許多很好的抽象來處理併發。

+0

SwingWorker看起來對未來更復雜的程序很有趣,謝謝 –