1

我有一个掷骰子的程序,并使用一个新线程循环以更新图像并重新绘制。这是我的代码:

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,因为它不会让其他线程完成。

有没有办法让图像代码每次循环并重新绘制,但要等到线程完成返回 int 滚动?

4

2 回答 2

0

将 放在方法o.notify();的末尾run()。顺便提一句。使用notifyAll()应该是首选。或者您可能会发现Future对象模式很有用。这是一篇关于它的文章http://www.vogella.com/articles/JavaConcurrency/article.html

或者,如果您正在开发 Swing 应用程序,请查看SwingWorker。但是,对于这项任务,SwingWorker 可能是矫枉过正。

Wait¬ify 是相当低级的 api,Java 中有许多很好的抽象来处理并发。

于 2012-12-22T19:59:05.697 回答
0

这看起来像是一个过于复杂的解决方案。您当然应该在EDT以外的线程中执行您的掷骰子/图像更新,但您不需要将该任务拆分为两个单独的线程。

只需有一个线程来处理您的骰子图像,然后当它完成时,它可以在您的标签中设置所选的骰子值(并且可能也在您的图像中)。

于 2012-12-22T20:02:10.677 回答