我有一个班级
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使用hash
的setter方法来更改hashmap。新值未反映在线程A和B中。
可能是什么问题呢?
谢谢!
答案 0 :(得分:1)
ThreadA
anf ThreadB
在其构造函数中都收到HashMap
,而不是类A
的对象。
即使您稍后更改了类hash
的对象的A
属性,也不会更改两个线程已经收到并存储的HashMap
引用。
如果您想确保两个线程都可以访问新的HashMap
,您必须提供对它们的新引用(因此您需要在ThreadA
中创建一个setter方法,并在某处存储对ThreadA
对象的引用,以便稍后调用setter),或直接传递类A
的对象。
答案 1 :(得分:0)
已经很晚了,而且是星期天......但是你不需要使用静态类吗?
我很确定会解决它......
答案 2 :(得分:0)
我这样理解你的问题。
你有以下的事情......
如果这是你的问题,那是因为ThreadA和B已经通过构造函数获得了哈希引用并对其进行了处理,在ThreadC中设置类A的哈希不会影响已经设置的ThreadA和B的哈希值。
考虑您遵循这些步骤
考虑这个解决方案
首先,在类A中删除静态关键字并使'hash'实例变量而不是类变量(我不确定你为什么这样做)并将类A对象传递给threadA和threadB而不是hash
ThreadA {A obj,
ThreadA(A obj)
{this.obj = obj} ..
//使用classAobj.getHash()的getter访问哈希并使用哈希映射继续处理
}