2012-12-22 170 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看起来对未来更复杂的程序很有趣,谢谢 –