2013-06-25 2 views
0

У меня есть основной поток, в котором я определил объект HashMap. Теперь в основном потоке я создаю N потоков. теперь каждый поток добавляет свой результат в объект HashMap основного потока и завершается. Я попытался передать объект HashMap в конструкторе, но когда я делаю это, каждый поток создает локальную копию объекта HashMap и редактирует его. Это изменение не сохраняется в объекте HashMap основного потока. что я делаю?Редактировать тему main thread by java

в моем главном классе

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

Использование 'this' в конструкторе может быть опасным, так как объект не полностью сконструирован в этой точке. –

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

} 
0

Вы код правильный. ThreadParallel не создает новую HashMap, но сохраняет ссылку на HashMap основного потока.

0

Я не думаю, что нити делают локальную копию, случается, что HashMap не поточно-, попробуйте заменить HashMap с ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap) таким образом:

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 
    } 

}

0

Если у вас нет какой-то синхронизации в йо u добавление данных блок, вы можете столкнуться с гораздо более сложными проблемами, чем это. Используйте ConcurrentHashMap для использования из разных потоков одновременно без необходимости дальнейшей синхронизации (и без блокировки на мониторах).