1

我有一堂课

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

我有两个线程线程 A 和线程 B

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));
}

另一个线程 C 使用 setter 方法hash来更改 hashmap。新值没有反映在线程 A 和 B 中。可能是什么问题?谢谢!

4

3 回答 3

1

两个ThreadAanf在其构造函数中都ThreadB接收 a HashMap,而不是 class 的对象A

即使您稍后更改hashclass 对象的属性A,这也不会更改HashMap两个线程已经接收和存储的引用。

如果要确保两个线程都可以访问 new HashMap,要么必须为它们提供新的引用(因此您还需要在其中创建一个 setter 方法ThreadA,并在某处存储对该ThreadA对象的引用,以便以后可以调用 setter),或者直接传递 class 的对象A

于 2012-07-23T05:06:23.973 回答
0

我以这种方式理解了你的问题..
你有以下事情..

  • A类{静态HashMap哈希,getter和setter}
  • ThreadA {HashMap hash, ThreadA(HashMap hash){this.hash = hash}}
  • 线程B ..等等
  • ThreadC {... some where setting of class A} and its not reflect in ThreadA and ThreadB..

如果这是你的问题,那是因为 ThreadA 和 B 已经通过构造函数获得了哈希引用并对其进行处理,在 ThreadC 中设置类 A 的哈希不会影响 ThreadA 和 B 已经设置的哈希。

考虑您遵循了这些步骤

  1. 创建了一个哈希 - 假设它指的是地址 1001
  2. 传递给 threadA 和 threadB 以便它们具有参考 1001 的散列
  3. 在 threadC 中创建了另一个哈希 - 假设它指的是 2001
  4. 将 ThreadC 创建的哈希设置为 A 类。即,现在 A 类哈希有引用 2001,仍然 ThreadA 和 ThreadB 持有哈希引用 1001,就是这样

考虑这个解决方案

首先,在 A 类中删除静态关键字并制作“散列”实例变量而不是类变量(我不确定你为什么这样做)并将 A 类对象传递给 threadA 和 threadB 而不是散列

  • A 类 {HashMap 哈希、getter 和 setter}
  • ThreadA {一个对象,

    线程A(一个对象)

    {this.obj = obj}..

    // 使用 classAobj.getHash() 的 getter 访问哈希并使用哈希映射继续处理

    }

  • 线程B ..等等
于 2012-07-23T06:24:49.010 回答
0

很晚了,现在是星期天......但是你不需要使用静态类吗?

我很确定这会解决它...

于 2012-07-23T05:02:19.350 回答