0

3 つのスレッドと、データを格納するハッシュマップを持つクラスがあります。スレッドの 1 つはハッシュマップにデータを書き込み、他の 2 つはそれを読み取ります。このようなもの:

public static class collector{
  Thread writter;
  Thread reader1;
  Thread reader2;
  HashMap storage;
  ...
  public void write(String s){
    storage.put(s.hashcode(),s);
  }
  public String read(long hash){
    return storage.get(hash);
  }
  public Set readAll(){
    return storage.entrySet();
  }
}

最初のスレッド (ライター) で最初のメソッド (書き込み) を実行し、リーダー 1 で読み取りを実行し、リーダー 2 で readAll を実行します。しかし、とにかくスレッド内のストレージにアクセスする方法が見つかりませんでした(メソッドを実行)。これらの 3 つのメソッドのように実行するスレッドを記述し、それらすべてが同時にストレージにアクセスできるようにするにはどうすればよいですか?

4

3 に答える 3

2

まず、このクラスをスレッドセーフにするにjava.util.concurrent.ConcurrentHashMapは、単純な old ではなく、スレッドセーフなハッシュ マップ実装を使用する必要がありますjava.util.HashMap

別のポスターは、collectorインスタンスをシングルトンに保持することを提案しました。これは、グローバル変数と同等です。グローバル データを使用するのではなく、collectorインスタンスを各スレッドに渡します。コンストラクターへの引数としてインスタンスRunnableを取るサブクラスを定義できます。をインスタンス変数にcollector格納します。collector次に、run()メソッド内から使用します。スレッドを開始するときは、 (適切なコンストラクターRunnableを使用して) それぞれに異なるオブジェクトを与えます。Thread

何かのようなもの:

class MyTask implements Runnable {
  private collector myCollector;
  public MyTask(collector _myCollector) {
    myCollector = _myCollector;
  }
  public void run() {
    // do something with myCollector
  }
}
于 2012-07-24T23:16:29.823 に答える
1

クラスは静的であるため、スレッドのrunメソッドからcollector.writeを呼び出すだけです。

于 2012-07-24T23:31:49.210 に答える
0

その変数と write、read、readAll メソッドを使用してシングルトン クラスを作成します。storageオブジェクトを同期するか、メソッドを同期することを確認してください。3 つのスレッドからこのシングルトン クラスにアクセスします。

于 2012-07-24T23:16:15.023 に答える