2011-07-31 25 views
4

Thread Aは、10のクライアントから渡されたデータの合計です。彼らは生きているのかいない(ハートビート技法)であるかどうか どのように2つのスレッドが互いに通信できますか?

while(true){ 
    Socket clientfd= server.accept(); 
    BufferedReader message = new BufferedReader(new InputStreamReader (clientfd.getInputStream())); 
    String val = message.readLine(); 
    this.sum_data+=(message.readLine(); 
    message.close(); 
    clientfd.close(); 
    this.left--; 
    if(this.left==0){ 
     System.out.println(this.sum_data); 
     break; 
    } 
} 

Thread B

は常にクライアントと通信しています。

クライアントは時々失敗することがあります。その場合、データを集計しているスレッドは、生きているクライアントからのすべての可能な結果を​​印刷するだけです。それ以外の場合は、決して結果を出力しません。

したがって、ハートビートスレッドが1つのクライアントから応答していないことに気づいた場合、他のスレッドに伝える方法がありますか(または他のスレッドのクラス変数this.leftを変更する方法はありますか)。

  1. 共有メモリ
  2. 共有メモリのアプローチでは

は、あなたがAA同期リストを作成することができますベースの

  • イベント/キューまたは:

  • 答えて

    8

    基本的には、通信をスレッドに2つの一般的なアプローチがあります両方のスレッドが読み書きできる同期マップです。通常、読み書きが競合なしに行われるようにするにはオーバーヘッドがあります。例えば、読み込み中に読み込み中のオブジェクトを読み込みたいと思わないようにしたい場合などです。 Javaは、Collections.synchronizedMapCollections.synchronizedListのように、適切に動作するコレクションを提供します。

    イベントまたはキューベースのスレッド通信では、スレッドには受信キューがあり、ほかのスレッドの受信キューには書き込みが行われます。このシナリオでは、ハートビートスレッドに読み込み元のクライアントがあるキューをロードし、もう一方のスレッドがこのキューからポーリング/取得を行い、その処理を実行することがあります。ハートビートスレッドは、処理スレッドがそれらを処理し続けることを「認識」するように、このキューに存続しているクライアントを継続的に追加することができます。

    関連する問題