2011-07-01 13 views
-2

私はクライアントからのデータを受信するサーバーを持っています。クライアントがデータを送信すると、スレッドに入ります。したがって、各スレッドにはデータがあります。 revFeaturePointsは、サーバーがクライアントから受け取るデータです。Java:異なるスレッドのオブジェクトを比較する方法

各revFeaturePointsには浮動小数点型配列があります。異なるスレッドで異なるrevFeaturePoint間のユークリッド距離を計算しますか?

他のスレッドの別のrevFeaturePointsにアクセスする方法を知りませんか?ここで

はコードです:

public class MyServer { 

public static void main(String[] args) throws IOException{ 
    ServerSocket serverSocket = null; 

    //bind a serverSocket to the port and listen 
    try{ 
     serverSocket = new ServerSocket(8888); 
     System.out.println("Listening: 8888"); 
    }catch(IOException e){ 
     e.printStackTrace(); 
    } 

    while(true) 
     new MyServerThread(serverSocket.accept()).start(); 
} 
} 

public class MyServerThread extends Thread{ 
//Create a socket for each client 
private Socket socket = null; 
private ObjectInputStream dataInputStream = null; 
private ObjectOutputStream dataOutputStream = null; 
private ArrayList<FeaturePointList> revFeaturePoints = null; 

//constructor 
public MyServerThread(Socket socket){ 
    super("MyServerThread"); 
    this.socket = socket; 
} 

@SuppressWarnings("unchecked") 
public void run(){ 
    try{    
     dataOutputStream = new ObjectOutputStream(socket.getOutputStream()); 
     dataInputStream = new ObjectInputStream(socket.getInputStream()); 
     System.out.println("ip: "+ socket.getInetAddress()); 
     revFeaturePoints = (ArrayList<FeaturePointList>) dataInputStream.readObject();   

    }catch(IOException e){ 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    finally{ 
     if(socket!=null){ 
      try{ 
       socket.close(); 
      }catch(IOException e){ 
       e.printStackTrace(); 
      } 
     } 
     if(dataInputStream!=null){ 
      try{ 
       dataInputStream.close(); 
      }catch(IOException e){ 
       e.printStackTrace(); 
      }    
     } 
     if(dataOutputStream!=null){ 
      try{ 
       dataOutputStream.close(); 
      }catch(IOException e){ 
       e.printStackTrace(); 
      }    
     } 

    } 
} 

}

+0

もっとコードを表示してください。あなたが提示したコードは、この質問にはまったく関係ありません。 'MyServerThread'の実装は何ですか?あなたは何かについて何か考えましたか? –

+0

また、「他のスレッドのデータと1つのデータを比較する」という正確な意味は?あなたが達成しようとしていることを明確に述べておけば、もっと良い答えが得られるかもしれません... –

+0

jcipのMemoizerを見たいかもしれません。 – Ron

答えて

1

簡単な方法は、データを返すMyServerThreadに同期メソッドを置くことです。

これを実行する別の方法は、BlockingQueueを使用してデータ結果をキューに入れ、その結果をプロデューサ/コンシューマパターンとして取得することです。これを行う方法については、hereを参照してください。

+0

私は同期メソッドを置く場合どのように別のスレッドの返されたデータを区別するには? – wzb5210

+0

'MyServerThread'のデータを設定または返すすべてのメソッドを同期させるのが最適です。これにより、一度に1つのスレッドだけがそのデータにアクセスできます。私はあなたが別のスレッドの返されたデータを区別することによって何を意味するのか分かりません。返されるデータがどのスレッドから来たのかを教えてください。 – adamjmarkham

+0

1つのスレッドだけがそのデータにアクセスできる場合、そのスレッドは他のスレッドのデータにアクセスできますか?スレッドはどのスレッドからどのようにデータを伝えますか? – wzb5210

1

あなたMyServerThreadクラスがフィールドにデータをスタッシュ場合、あなたはMyServerThreadの複数のインスタンスからそのフィールドにアクセスすることができます。

+0

フィールドにデータを隠すことはどういう意味ですか?これは私の受け取ったデータです。 revFeaturePoints =(ArrayList )dataInputStream.readObject(); – wzb5210

+0

@ wzb5210: 'revFeaturePoints'をフィールドにするだけです。 –

+0

私に例を教えてください。私はそれを知らない。 – wzb5210

1

共有構造を使用し、同期を正しく行うことで、スレッド間でデータを共有できます。たとえば、MyServerThreadにはConcurrentHashMap<'threadname', data>があり、各スレッドはそのデータを入れて他のスレッドでデータを検索します。

つまり、アーキテクチャを評価する必要があります。 N個のスレッドが他のN-1スレッドがデータで何をしているかを確認する必要がある場合は、パフォーマンスの低下のためのレシピを準備しています。おそらく、あなたのアーキテクチャでは、いくつかのレイヤーを作成して、いくつかのServerThreadsがリクエストを収集し、それらを同時に共有構造(キューなど)に配置することが考えられます。次に、別の作業者がデータを比較して処理し、結果を共同システムで生成しています。 producer-consumer patternをご覧ください。 [本当にコメントますが収まりません。)]

+0

ありがとうございます、私は例を見ていきます。 – wzb5210

1

maasgの答えは、一般的な意味では非常に正しいですが、私はあなたが今、Javaはそれ自体の実装をスレッド設計の難しさを見ていないされていると信じています。

サーバーは、接続要求ごとに使い捨てスレッドを起動します。このスレッドはクライアントから1つのオブジェクトを読み取り、接続を閉じます。渡されたオブジェクトは、(サーバースレッド)インスタンススコープオブジェクトに入れられます(run()を終了した後にガベージコレクションされます)。

これは設計上の問題であるという印象をどのようにして比較するのか、それともどのようにして2つの同時スレッド(常に)があることを保証するのかを決定する方法は完全には不明です。まずは

論理的には、サーバースレッドとドメイン内のいくつかの意味のある問題の間に、ドメイン固有の関連付けがあることは明らかです。この関係はコードで具体化する必要がありますが、まずこの区別と関係が何であるかを理解する必要があります。

+1

+1は絶対に同意します。スレッドの一時的な性質は、あなたが*と*比較する何かを持っていることを保証するものではありません。この問題に対する答えは、共有データ構造の同期と並行性に関係しますが、ここで深いアーキテクチャ上の問題があります。解決されると、並行性が扱いやすくなります。 – maasg

-1

オブジェクトは異なるスレッド内にありません。オブジェクトは他の異なるオブジェクトのメンバーで、通常は 'get'メソッドで参照されます。スレッドの問題を完全に忘れてしまっても、それは無関係です。オブジェクトAのメンバーとオブジェクトBのメンバーを比較したいだけです。これは通常どおりのビジネスです。

+0

ここにいくつかのエラーがありますか? – EJP

+0

おそらく私のタイトルは適切ではありません。ここのオブジェクトは実際にはデータです。異なるスレッドのデータ間のユークリッド距離を計算するもの – wzb5210

+0

@ wzb5210多分、「オブジェクトは別のスレッドにはありません」などの不明な点がありますが、私はそうは思わないのです。 – EJP