0

Этот вопрос относится к How to Queue and Call Actual Methods... Во всяком случае, я решил (в конце концов) пойти с анонимной идеей класса. Проблема в том, что когда я добавляю свой анонимный класс в связанный список, он фактически вызывает 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(); 
} 

бег() является абстрактным методом, который реализуется с помощью дочернего класса. Я просто не уверен, почему он печатает, когда он добавлен, а не выполнен. Я понимаю, это будет означать, что performBehavior() фактически выполняется несколько раз, а не один раз за галочку, но это не так.

+0

Ваш образец кода не собирается компилироваться. Можете ли вы сделать это или добавить какой-то контекст? –

+0

Хммм ... Я не думаю, что реальный код будет очень полезен, так что давайте посмотрим ... Существует класс под названием SimbadAgent, в котором находится функция executeBehavior(), а также другие методы. this.actions.add (новый AgentAction (this) {...}); вызывается внутри одного метода внутри SimbadAgent. К сожалению, я не уверен, есть ли еще что-то еще. Извините, если это не поможет. – nathas

+0

Давайте тогда будем ясны. Нет, этот код не вызывает выполнение при добавлении действия. Вы не правы. Бремя лежит на вас, чтобы доказать обратное, а вы этого не сделали. Удачи вам получить бесплатную помощь, когда вы не хотите тратить время, предоставляя нам информацию, необходимую нам, чтобы помочь вам. Прочтите http://sscce.org и дайте нам один. –

ответ

0

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

+0

Спасибо Хэнк. @Mark Peters Мои извинения, у меня всегда будет полный пример того, что мой код в следующий раз я отправляю. Программа, которую я пишу, зависит от большого количества другого кода, и я был в процессе написания более мелкой тестовой программы для публикации. У меня есть .. интересное время, делающее все правильно, но эй, я полагаю, именно поэтому это непросто :) Еще раз спасибо. – nathas

 Смежные вопросы

  • Нет связанных вопросов^_^