奇数链表/匿名类行为 - 添加后执行?

时间:2010-06-21 14:56:31

标签: java linked-list execution anonymous-class first-class-functions

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

1 个答案:

答案 0 :(得分:0)

魔鬼在于细节。在你没有展示的代码中几乎肯定有一个错误(我的猜测是run),但让我们解决更深层次的问题。此代码看起来像 LOT ,就像producer-consumer问题一样。如果是这样,我建议检查java.util.concurrent:它充满了与并发相关的优点,使得像这样 WAY 这样的事情比试图推销自己更容易。对于您的特定情况,看起来ScheduledExecutorService可能是合适的。如果它不是你所需要的,我仍然建议在包装中逛一逛;就像我说的那样,它充满了方便的东西,可能比你从并发原语构建的东西更容易使用。