1

クラスがあります

class A {
  private static HashMap hash;
  public static void setHash(HashMap hash)
  {
    this.hash=hash;
  }
  public static HashMap getHash()
  {
    return hash;
  }
}

スレッドAとスレッドBの2つのスレッドがあります

public class ThreadA implements Runnable
{
  private HashMap hash;
  public ThreadA(HashMap hash)
  {
    this.hash = hash
  }
}

同様に、ThreadB についても

メインクラスでは、次のことを行います

main()
{
  // inserted some values in hashmap 
  Thread t1 = new Thread(new ThreadA(hash));
  Thread t2 = new Thread(new ThreadB(hash));
}

もう 1 つのスレッド C は、setter メソッドを使用しhashてハッシュマップを変更します。新しい値がスレッド A と B に反映されていません。何が問題なのですか? ありがとう!

4

3 に答える 3

1

両方のThreadAanfは、 class のオブジェクトではなく、コンストラクターでThreadBa を受け取ります。HashMapA

hashclass のオブジェクトの属性を後で変更しても、両方のスレッドによって既に受信および保存されている参照Aは変更されません。HashMap

両方のスレッドが新しいHashMap.セッターを呼び出す)、または直接 class のオブジェクトを渡します。ThreadAThreadAA

于 2012-07-23T05:06:23.973 に答える
0

遅くなりましたが、日曜日です...しかし、静的クラスを使用する必要はありませんか?

きっとそれで治るはず…

于 2012-07-23T05:02:19.350 に答える
0

私はあなたの質問をこのように理解しました..
あなたは次のことを持っています..

  • クラス A {静的 HashMap ハッシュ、getter および setter}
  • ThreadA {HashMap ハッシュ、ThreadA(HashMap ハッシュ){this.hash = ハッシュ}}
  • ThreadB ..など
  • ThreadC {...クラスAのハッシュを設定する場所}とThreadAとThreadBに反映されていない..

これが問題である場合、ThreadA と B が既にコンストラクターを介してハッシュ参照を取得し、それに取り組んでいるためです。ThreadC でクラス A のハッシュを設定しても、ThreadA と B の既に設定されているハッシュには影響しません。

これらの手順を実行したと考えてください

  1. ハッシュを作成しました - アドレス 1001 を参照していると仮定しましょう
  2. threadA と threadB に渡され、参照 1001 のハッシュを持つようになります
  3. スレッドCで別のハッシュを作成しました-2001年を参照していると仮定しましょう
  4. ThreadC によって作成されたハッシュをクラス A に設定します。つまり、クラス A のハッシュは 2001 を参照しますが、ThreadA と ThreadB は 1001 を参照するハッシュを保持します。

解決策としてこれを検討してください

まず、クラスAで静的キーワードを削除し、クラス変数の代わりに「ハッシュ」インスタンス変数を作成し(なぜそれを作成したのかわかりません)、ハッシュの代わりにクラスAオブジェクトをスレッドAとスレッドBに渡します

  • クラス A {HashMap ハッシュ、ゲッターおよびセッター}
  • ThreadA {オブジェクト、

    ThreadA(オブジェクト)

    {this.obj = obj}..

    // classAobj.getHash() の getter を使用してハッシュにアクセスし、ハッシュ マップで処理を進めます

    }

  • ThreadB ..など
于 2012-07-23T06:24:49.010 に答える