0

この質問は、実際のメソッドをキューに入れて呼び出す方法に関連しています。とにかく、私は(結局のところ)匿名のクラスのアイデアを採用することにしました。問題は、匿名クラスをリンクリストに追加すると、実際にはすぐに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回ではなく複数回実行されていることを意味することを理解していますが、そうではありません。

4

1 に答える 1

0

悪魔は細部に宿る。表示されていないコードのどこかにバグがあることはほぼ確実ですが (私の推測ではrun)、より深い点に対処しましょう。このコードは、生産者と消費者の問題によく似ています。もしそうなら、私はチェックアウトすることをお勧めします。それは、自分でロールバックしようとするよりも、この方法のようなことを簡単する並行性関連の利点にあふれています. あなたの特定のケースでは、それがぴったりのようです。必要なものではない場合でも、パッケージを調べてみることをお勧めします。私が言ったように、並行プリミティブから自分で構築したものよりも、おそらくはるかに簡単に操作できる便利なものが詰め込まれています。java.util.concurrentScheduledExecutorService

于 2010-06-21T16:11:30.320 に答える