質問

私を信じてチームの手続が実行する必要のある次までのいずれかで実行され、一定の条件を満たすものにこの基本コードのニーズに実行されるまでの条件が満たされた:

public boolean search()
{
    robot.go();

    robot.spin();

    //etc - around 8 more similar commands (each takes around 2 seconds)
    return false; //didn't find what it was looking for
}

これまでのように思いことをやるというたかったのです:

public boolean search()
{
    robot.go(false);
    while(robot.isMoving())
    {
        if(thingFound())
        {
            robot.stop()
            return true;
        }
        Thread.yield();
    }

    robot.spin(false);
    while(robot.isMoving())
    {
        if(thingFound())
        {
            robot.stop()
            return true;
        }
        Thread.yield();
    }


    //etc - around 8 more similar commands
    return false; //didn't find what it was looking for
}

false パラメータ go()spin() これはすぐに復帰の状態を確認する。しかし、このアプローチ打っても非効率で、同じブロックをコードする必要を10回繰り返します。さらに、これが達成効率を上げるとともに例外または並行スレッド?

役に立ちましたか?

解決

ジョナサン・レフラーの回答に基づいての:
あなたは、コマンドへののポインタ

としてのRunnableを使用することができます
private final Runnable going = new Runnable() {
    @Override
    public void run() {
        robot.go(false);
    }
});

private final Runnable spinning = new Runnable {
    @Override
    public void run() {
        robot.spin(false);
    }
});

// other commands 


private boolean isFoundAfter(Runnable command)
{
    command.run();
    while (robot.isMoving())
    {
        if (thingFound())
        {
            robot.stop()
            return true;
        }
        Thread.yield();
    }
    return false;
}

public boolean search()
{
    if (isFoundAfter(going)) return true;

    if (isFoundAfter(spinning)) return true;   

    //etc - around 8 more similar commands
    return false; //didn't find what it was looking for
}


一つの更なるステップは、適切であれば、置くの配列やリストののコマンドと

スクリプトとして実行します
...

private boolean executeSearch(Runnable... commands)
{
    for (Runnable cmd : commands) {
        if (isFoundAfter(cmd)) return true;
    }
    return false; //didn't find what it was looking for
}

public boolean search() {
    return executeSearch(going, spinning /* around 8 more similar commands */);
}

他のヒント

なぜ使用しているのかわかりません Thread.yield() - 言及していない他のスレッドが実行されていますか?あるいは問題を読み間違えたのかもしれません。

おそらくコマンドパターンがここで機能すると思います。あなたは持っているでしょう RobotCommand とのインターフェース execute メソッドとその実装 RobotCommand コマンド タイプごと (go、spin など)。次に、次のように構築できます RobotAlgorithm として ListRobotCommand, 、メソッドがあります executeRobotAlgorithm リストを反復処理して呼び出します execute それぞれの RobotCommand そして結果を確認すると、 thingFound() それぞれの後に。

編集 - ああ、わかった気がする。する go そして spin ロボットの状態を変更するスレッドを開始するとか、そのようなものですか?

編集2 - あなたのコメントに応えて、ここでの問題は、ロボットが探しているものを見つけた場合にすぐに戻ることができる必要があることのようですが、 go, spin, 、etc コマンドは現時点ではこれを実行しません。その間、新しいコマンドを実行し続ける機能が必要です。したがって、ここで私ができることは、2つのスレッドを用意することです - 1つは、あなたのプログラムを実行する「エグゼキュータ」スレッドです。 ListRobotCommand1 つずつ、スリープとポーリングを繰り返す「ウォッチャー」スレッド (確認してください) thingFound())。もし thingFound() 常に true の場合は、ロボットとエグゼキュータ スレッドを停止することができます。または、エグゼキュータが終了する前に終了する場合は、 thingFound() true の場合、(必要に応じて) そのように通知できます。

明らかに、whileループは、独自の機能にパッケージすることができます

private boolean isFound()
{
    while (robot.isMoving())
    {
        if (thingFound())
        {
            robot.stop()
            return true;
        }
        Thread.yield();
    }
    return false;
}

public boolean search()
{
    robot.go(false);
    if (isFound()) return true;

    robot.spin(false);
    if (isFound()) return true;   

    //etc - around 8 more similar commands
    return false; //didn't find what it was looking for
}

(条件が2行に分割されている場合、私は気にしない、私はおそらく、生産コードでそれを行うだろう)。

あなたは(Cプログラミングの観点で関数へのポインタ、)「手順」の周りを渡すことができるかどうか、私はあなたを伝えることができるよりも優れたJavaプログラマ。 私がすることができます疑いがあるが、私は、構文やルールを知らない。 <のhref = "http://www.velocityreviews.com/forums/t130043-function-as-parameter.html "REL =" nofollowをnoreferrer ">証拠のは、あなたが(とにかく2004年頃)ことができないことのようです。

ロボットを利用できるので、条件オブジェクトに信号をコントローラーであるサブタスクや入った新しい状態:

http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/Condition.html

興味深い、環境のではありません使用 notify()wait() 代わりに、より柔軟な条件です。コントローラがwait()までのロボットを決定のページをご覧になったとの通知().

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top