Java同步对象,等待并通知

时间:2012-12-22 19:47:19

标签: java synchronized

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

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滚动?

2 个答案:

答案 0 :(得分:0)

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

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

Wait&amp; notify是一个非常低级别的api,Java中有很多很好的抽象来处理并发。

答案 1 :(得分:0)

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

只有一个线程可以摆弄你的骰子图像然后当它完成时,它可以在你的标签中设置所选的骰子值(也可能在你的图像中)。