したいので割り込みのシーケンスの手続きにJava?
-
19-09-2019 - |
質問
私を信じてチームの手続が実行する必要のある次までのいずれかで実行され、一定の条件を満たすものにこの基本コードのニーズに実行されるまでの条件が満たされた:
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回繰り返します。さらに、これが達成効率を上げるとともに例外または並行スレッド?
解決
ジョナサン・レフラーの回答に基づいての:
あなたは、コマンドへののポインタの
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
として List
の RobotCommand
, 、メソッドがあります executeRobotAlgorithm
リストを反復処理して呼び出します execute
それぞれの RobotCommand
そして結果を確認すると、 thingFound()
それぞれの後に。
編集 - ああ、わかった気がする。する go
そして spin
ロボットの状態を変更するスレッドを開始するとか、そのようなものですか?
編集2 - あなたのコメントに応えて、ここでの問題は、ロボットが探しているものを見つけた場合にすぐに戻ることができる必要があることのようですが、 go
, spin
, 、etc コマンドは現時点ではこれを実行しません。その間、新しいコマンドを実行し続ける機能が必要です。したがって、ここで私ができることは、2つのスレッドを用意することです - 1つは、あなたのプログラムを実行する「エグゼキュータ」スレッドです。 List
の RobotCommand
1 つずつ、スリープとポーリングを繰り返す「ウォッチャー」スレッド (確認してください) 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()までのロボットを決定のページをご覧になったとの通知().