背景:
我有一个微型机器人(这些扩展Thread
类)的应用程序,它们在地图的节点上相互处理。我正在尝试对进入节点的逻辑进行编程。该节点负责执行在该节点相遇的两个机器人之间的交易。
我想在节点中编码的逻辑如下:
- 机器人 A 来了。
- 如果节点上存在另一个 Bot(例如 Bot B)
- 然后在 Bot A 和 Bot B 之间促成交易。
- ELSE告诉 Bot A 等到另一个 Bot 到达节点。
我的尝试
这是我对上述逻辑进行编码的尝试。
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)
但这只是冻结了一切,我什至无法调试代码,因为一切都被冻结了。