2017-02-23 21 views
0

まず、私の問題を簡単に説明します。 simbadシミュレータ(http://simbad.sourceforge.net/doc.php - 私の質問にとって重要ではない)に基づいて、私は環境を探索するローバーを配備するシステムを構築したいと考えています。考え方は、これらのローバーが他のローバーと同様に環境内の障害を避けるということです。これをシミュレーションと呼んでみましょう。 このシミュレーションの主な要素は、もちろん、ローバー、環境、ローバーを制御し、コマンドを送信する中央ステーションです。これはスレッド上で実行されます。Javaのスレッド間通信と実行可能性

私が望むものは、別のスレッド/プロセスで、リスナーを持つことです。これは、キーボードから入力されたコマンドを聞いて、それらをセントラルステーションによるシミュレーションで適用されるコマンドに変換します。 たとえば、各ローバにはIDが割り当てられている可能性があり、そのIDに基づいてリムーバを削除したいことがあります。次に、私は次のような記述をしたい:remove rover 1、別のスレッドで実行されているリスナーは、これをコマンドにマップし、たとえば関数centralStation.removeRobot(id_of_robot)を呼び出します。

これを実装する最良の方法は何ですか?基本的に私は2つのスレッドを持っています.1つはシミュレーションを実行し、もう1つはコマンドを聞きます。そして、centralStationは共有リソースでなければなりませんか?どのように共有リソースにするのですか(メインステーションを作って中央ステーションを起動し、他の2つのスレッドを呼び出して仕事を始めますか?)

私はこれに関するベストプラクティスが何であるか、それをできるだけシンプルにする方法を考えていました。 ありがとうございました:)

+0

既存のJavaツールでスレッドを処理できるようにします。代わりに[キーリスナー](https://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html)のようなものを使用してください。あなたは1つのメインスレッドしか必要とせず、ロックなどを扱う必要はありません。 –

+0

また、StackOverflowはこのような種類の_ために設計されていません。どうすればいいですか?_質問 - このコミュニティは代わりにアルゴリズム/コードなどの問題を手伝ってください。あなたの質問はよく書かれていました。 –

答えて

0

簡単な解決策は、コンポーネント間に適切なデータ構造を設定することです。

たとえば、ConcurrentLinkedQueueのインスタンス。ここの考え方は、あなたの「入力」スレッドが「コマンド」オブジェクトをそのキューに書き込むことです。もう一方のスレッドはそのキューを調べ、新しいコマンドが見つかったらそれをシミュレーションに「適用」します。

重要な側面は、実際には2つのスレッドが何らかの理由でデータを操作したくないということです。

0

さてどのように文字列がローバー/のidは、私が正しい、あなたがシステムを開始したいとランタイムのパスでそれを理解していた場合、あなたのリスナーが中央局に https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Exchanger.html

を移転することを命じるであるJavaの交換、についてローバーID /コマンドは、リスナ(独立したスレッドにある)を介して中央ステーション(これは別個のスレッド内にある)に処理された後である。 メインスレッドでは、シミュレータを起動し、エクスチェンジャを作成し、中央ステーション用とリスナ用の2つのスレッドを開始します。

// pseudocode for main 
    main() { 
     // start simulator (I am not sure what this thing is) 
     Exchanger<String> exc = new Exchanger<String>(); 
     new CentralStationThread(exc); 
     new CommandListenerThread(exc); 
    } 

は今CentralStationThreadにあなたがしたいかもしれない最初の事の一つは、リスナー

//pseudocode for run method of central station 
    public void run(){ 
     String roverIdToStop = exc.exchange(new String); 
     // some code to trigger the rover stop 
     // send in replacement rover 
    } 

そしてCommandListenerThreadスレッドで似たように登録しているが、ない開始時

//pseudocode for run method of listener 
    public void run(){ 
     // Listen to keyboard 
     // String roverIdOrCommand = Parse the command & make something out out it 
     // when the command is ready to be sent to central station do following 
     String roverIdToStop = exc.exchange(roverIdOrCommand); 
     // keep looking for further commands 
    } 

私は同意する、同じことを達成するために私にいくつかの方法があるかもしれないが、これが私の心に来たものである。それが役に立てば幸い !