此问题与How to Queue and Call Actual Methods..有关。无论如何,我决定(毕竟)采用匿名课程的想法。问题是当我将我的匿名类添加到链表时,它实际上是立即调用execute()而它不应该是。稍后将调用Execute()。无论如何,这就是我所拥有的:
private LinkedList<AgentAction> actions;
public boolean blockingSensor;
this.actions.add( new AgentAction(this) {
public void execute() {
//setRotationalVelocity(0);
kinematic.setWheelsVelocity(0,0);
this.agent.setBlockingSensors(false);
this.agent.printLCD("Turn, blocking = "+this.agent.blockingSensor);
}
public Object getValue() {
return null;
}
});
//this is essentially the main()
public void performBehavior()
{
//make sure to only call run() each tick, not every ms
if ( this.oldCounter < getCounter() )
{
if ( !isWorking() )
{
run();
}
this.oldCounter = getCounter();
this.actions.removeFirst().execute();
}
}
abstract class AgentAction
{
SimbadAgent agent;
public AgentAction(SimbadAgent a)
{
this.agent = a;
}
public abstract void execute();
public abstract Object getValue();
}
run()是一个由子类实现的抽象方法。我只是不确定为什么它在添加时打印,而不是执行。我理解这意味着performBehavior()实际上是多次执行而不是每次执行一次,但事实并非如此。
答案 0 :(得分:0)
魔鬼在于细节。在你没有展示的代码中几乎肯定有一个错误(我的猜测是run
),但让我们解决更深层次的问题。此代码看起来像 LOT ,就像producer-consumer问题一样。如果是这样,我建议检查java.util.concurrent
:它充满了与并发相关的优点,使得像这样 WAY 这样的事情比试图推销自己更容易。对于您的特定情况,看起来ScheduledExecutorService
可能是合适的。如果它不是你所需要的,我仍然建议在包装中逛一逛;就像我说的那样,它充满了方便的东西,可能比你从并发原语构建的东西更容易使用。