我有一个主线程,我在其中定义了一个HashMap对象。现在在主线程中我创建了N个线程。现在每个线程都会将其结果附加到主线程的HashMap对象中并终止。我尝试在构造函数中传递HashMap对象,但是当我这样做时,每个线程都会创建一个HashMap对象的本地副本并对其进行编辑。此更改不会保存在主线程的HashMap对象中。我该怎么办?
在我的主要班级
ThreadParallel threads[] = new ThreadParallel[N];
HashMap<Integer, String> map = new HashMap<Integer, String>();
for(int i=0;i<N;i++)
{
threads[i] = new ThreadParallel(map);
}
现在在ThreadParallel类
中public class ThreadParallel implements Runnable{
HashMap<Integer, String> map;
Thread t;
public ThreadParallel(HashMap<Integer, String> map) {
this.map = map;
t = new Thread(this);
t.start();
}
@Override
public void run() {
// adding data
}
}
答案 0 :(得分:0)
不是最好的设计,而是如何在主类中使地图公开和静态并在线程类中访问它。另外使用concurrentHashMap将消除同步问题。
ThreadParallel threads[] = new ThreadParallel[N];
public static ConcurrentMap<Integer, String> map = new ConcurrentHashMap<Integer, String>();
for(int i=0;i<N;i++)
{
threads[i] = new ThreadParallel(map);
}
ThreadParallel类
public class ThreadParallel implements Runnable{
Thread t;
public ThreadParallel() {
t = new Thread(this);
t.start();
}
@Override
public void run() {
// adding data by accessing the main class map in static way
// something lik MainClass.map.put(1,"test");
}
}
答案 1 :(得分:0)
您的代码是正确的。 ThreadParallel不会创建新的HashMap,而是保存对主线程的HashMap的引用。
答案 2 :(得分:0)
我并不认为线程正在制作本地副本,碰巧HashMap 不是线程安全的,尝试用ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap)替换HashMap方式:
ThreadParallel threads[] = new ThreadParallel[N];
Map<Integer, String> map = new ConcurrentHashMap<Integer, String>();
for(int i=0;i<N;i++) {
threads[i] = new ThreadParallel(map);
}
并且还更改了线程中的代码:
public class ThreadParallel implements Runnable{
Map<Integer, String> map;
Thread t;
public ThreadParallel(Map<Integer, String> map) {
this.map = map;
t = new Thread(this);
t.start();
}
@Override
public void run() {
// adding data
}
}
答案 3 :(得分:0)
除非你在添加数据块中有一些同步,否则你可能遇到比这更糟糕的问题。使用ConcurrentHashMap可以同时从不同的线程使用,而无需进一步同步(并且在监视器上没有任何阻塞)。