0

这个问题与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() 实际上被执行多次而不是每次执行一次,但事实并非如此。

4

1 回答 1

0

细节决定成败。几乎可以肯定,在您未显示的代码中某处存在错误(我的猜测是run),但让我们解决更深层次的问题。这段代码看起来很像那里的生产者-消费者问题。如果是这样,我建议检查一下java.util.concurrent:它充满了与并发相关的优点,这使得这样的事情比尝试自己动手更容易对于您的特定情况,它看起来ScheduledExecutorService可能很合适。如果它不完全是您所需要的,我仍然建议您在包装中四处寻找;就像我说的那样,它塞满了方便的东西,这些东西可能比你从并发原语中自己构建的东西更容易使用。

于 2010-06-21T16:11:30.320 回答