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 メソッドは int として 0 を返します。

画像コードをループして毎回再描画する方法はありますが、スレッドが終了して int を返すまで待ち​​ますか?

4

2 に答える 2

0

これは非常に複雑なソリューションのように見えます。EDT以外のスレッドでサイコロの転がり/画像の更新を実行する必要がありますが、そのタスクを 2 つの別々のスレッドに分割する必要はありません。

サイコロの画像をいじるスレッドを 1 つ用意するだけで、それが終了したら、選択したサイコロの値をラベルに (おそらく画像にも) 設定できます。

于 2012-12-22T20:02:10.677 に答える
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 に答える