Domanda

Questa domanda è legata alla Come coda e chiamare i metodi effettivi .. . Ad ogni modo, ho deciso di (dopo tutto) andare con l'idea classe anonima. Il problema è che quando aggiungo la mia classe anonima alla lista collegata, in realtà è chiamare execute () subito ... e non dovrebbe essere. Execute () deve essere chiamato in seguito. Comunque, questo è quello che ho:

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 () è un metodo astratto che viene implementato da una classe figlia. Solo che non sono sicuro perché è la stampa quando è aggiunto, piuttosto che eseguito. Capisco ciò implica che performBehavior () in realtà viene eseguita più volte, piuttosto che una volta per tick, ma non è questo il caso.

È stato utile?

Soluzione

Il diavolo è nei dettagli. C'è quasi certamente un qualche bug nel codice che non stai mostrando (la mia ipotesi è run), ma cerchiamo di indirizzo un punto più profondo. Questo codice è un LOT come se ci problema produttore-consumatore . Se è così, vi consiglio di check-out java.util.concurrent : è traboccante di bontà concorrenza-correlato che rende le cose in questo modo WAY più facile che cercare di rotolare il proprio. Per il vostro caso particolare, sembra che ScheduledExecutorService potrebbe essere una buona misura. Se non è esattamente ciò che serve, mi raccomando ancora rovistando nella confezione; come ho detto, è farcito con le cose utili che probabilmente saranno molto più facile da lavorare rispetto qualcosa di voi stessi costruito dai primitivi di concorrenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top