1

リクエストをリッスンするクラス(サーバー)があり、リクエストが行われると、それを処理する新しいスレッドを開始します。ハンドラー スレッドはデータを読み取り、それをハッシュマップに格納して終了します。データが入ってきたときに複数のハンドラースレッドがデータを読み取る可能性があるため、ハッシュマップをサーバークラスに配置しました。

ハッシュマップを変更/アクセスするには、ゲッターとセッターを作成し、サーバークラスをすべてのワーカースレッドに渡す必要があるため、これが正しいアプローチであるかどうか混乱しています。私のクエリを試して説明するためのいくつかのサンプルコード:

public class Server implements Runnable {
        private HashMap<String, Integer> data;

    public void run() {
       while(true) {
            Socket s = serverSocket.accept();
            Handler h = new Handler(s);
            Thread t = new Thread(h);
            t.start();
       }
   }
}

public class Handler implements Runnable {

    public void run() {
        //read in data from socket
        data.put(d); //access the hashmap and insert data in
    } 

}

アドバイスをいただければ幸いです。ありがとう。

4

1 に答える 1

3

あなたのアプローチは問題ありませんが、、ConcurrentMapまたはsynchronizeマップ上で使用する必要があります。可能な場合はいつでもブロッキングを回避するために同期されたコレクションが最適化されるため、最初のアプローチの方が優れています。

于 2013-02-23T20:28:49.593 に答える