0

バックグラウンド:

Thread私は、マップのノードで互いに取引を行う小型ロボット (これらの拡張クラス) のアプリケーションを持っています。ノードに入るロジックをプログラムしようとしています。ノードは、ノードで出会う 2 つのボット間の取引を実行する責任があります。

ノードにコーディングしたいロジックは次のとおりです。

  • ボット A が到着します。
  • ノードに別のボットが存在する場合 (例: ボット B)
  • 次に、ボット A とボット B の間で取引を仲介します。
  • ELSEボット A に、別のボットがノードに到着するまで待つように指示します。

私の試み

これが、上記のロジックをコーディングする私の試みです。

public void trade(StrippedBot trader)
{
    // check to see if there are any other bots waiting
    if(bots.size() > 0)
    {
        for (StrippedBot b : bots.keySet()) {
            if(!b.equals(trader) && !b.getFamily().getName().equals(trader.getFamily().getName()))
            {
                b.notify();
                trader.getResource().adjust(COOPERATION_REWARD);
                b.getResource().adjust(COOPERATION_REWARD);
                trace(trader);
            }
        }
    } else {
        // this is the first bot here, so shall wait for others to come.
        try
        {
            bots.put(trader, true); // keeping track - true to mean this bot is on wait().
            trader.wait(); // Tell Bot to wait till another bot comes along.
        } catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
}

しかし、私がそれを実行するとIllegalMonitorStateExceptiontrader.wait()オンラインになります。調べてみましたが、よくあるトラブルのようです。だから私は試してみましたsynchronized(trader)が、すべてがフリーズしただけで、すべてがフリーズしたため、コードをデバッグすることさえできませんでした。

4

2 に答える 2

0

したがって、あなたが実行しているtrader.wait()が誰も実行していないため、コードはブロックされますtrader.notify()。それからまた多分btraderです。コードからはわかりません。notify()別のスレッドで待機しているのとまったく同じオブジェクトに対してa を実行する必要があります。

IllegalMonitorStateExceptiontrader.wait() 行で取得します。調べてみたところ、よくある問題のようです。だから私は同期(トレーダー)を試しました

右。オブジェクトを実行するには、その特定のオブジェクトのブロックnotify()wait()にいる必要があります。synchronized

  • notify()は保存されないことに注意してください。a を実行してもメソッドにnotify()誰もいない場合、は何もしません。wait()notify()
  • コードをデバッグできるはずです。Eclipse は (少なくとも) すべてのスレッドを表示します。一時停止しているものが表示されるまで上下にスクロールします。次に、それを展開して、吊り下げられている場所を確認できます。
  • System.out.println(...)スタイルのデバッグを自由に行って、何が起こっているかを確認してください。

幸運を。

于 2013-05-01T23:51:23.290 に答える
0

に対処するにはIllegalMonitorStateException:同期されていないオブジェクトに対してorを呼び出すことはできません。呼び出したいオブジェクトまたは上で同期する必要があります。waitnotifywaitnotify

しかし、あなたのコードには他の問題があると思います。たとえば、 on の場合、waitonにしtraderたいでしょう。さらに問題があると思われますが、OP の直接の質問への回答に制限します。notifytrader

于 2013-05-02T03:39:34.610 に答える