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