Поведение нечетного связанного списка / анонимного класса - выполняется при добавлении? - PullRequest
0 голосов
/ 21 июня 2010

Этот вопрос относится к Как поставить в очередь и вызвать фактические методы .. .Во всяком случае, я решил (в конце концов) пойти с идеей анонимного класса.Проблема заключается в том, что когда я добавляю свой анонимный класс в связанный список, он на самом деле немедленно вызывает 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 () - абстрактный метод, который реализуется дочерним классом.Я просто не уверен, почему он печатает, когда он добавлен, а не выполнен.Я понимаю, что это будет означать, что executeBehavior () на самом деле выполняется несколько раз, а не один раз за такт, но это не так.

1 Ответ

0 голосов
/ 21 июня 2010

Дьявол кроется в деталях.Почти наверняка есть ошибка в коде, который вы не показываете (я думаю, run), но давайте обратимся к более глубокому вопросу.Этот код выглядит как LOT как там производитель-потребитель проблема.Если это так, я рекомендую проверить java.util.concurrent: он переполнен добротой, связанной с параллелизмом, которая делает такие вещи WAY проще, чем попытка свернуть собственную.Для вашего конкретного случая это выглядит так: ScheduledExecutorService может подойти.Если это не совсем то, что вам нужно, я все же рекомендую покопаться в пакете;как я уже сказал, он наполнен удобными вещами, с которыми, вероятно, будет гораздо проще работать, чем с тем, что вы создали сами из примитивов параллелизма.

...