Threads greifen auf Config-Variablen zu

Moin,

@VFL
Danke fuer den nett gemeinten Ratschlag,

ich bin mir durchaus die Funktionalitaeten diverser Knoepfe in Formularen bewussst. Nur kann ich die Knoepfe nur dann benutzen, wenn sie vorhanden sind.
Hier als Gast sehe ich (zumindest im Firefox) nur die Knoepfe Antworten und Vorschau, mehr nicht.

Oh bitte ... gerne ;)

Aber dann gilt immer noch :
klammere Deinen Code händisch mit [_JAVA]...[_/JAVA] (ohne die Unterstriche) :p

Gruß
Klaus
 
Hallo ihrs und frohe Ostern gehabt zu haben.

So, ich habe nun nochmal mein Threadhandling ueberprueft und nachdem ich die Values verglichen habe, wie viele Elemente mit der put Methode uebergeben werden und wie viele mit der get Methode von jedem Thread entnommen werden, habe ich festgesellt, dass das Thread handling an und fuer sich einwandfrei laeuft, es werden alle entsprechenden Werte uebergeben und die Plugins arbeiten auch mit allen erzeugten Werten.

Nun bin ich dabei auf das Problem gestossen, dass hier und da die Hashmaps in bestimmten Plugin Instanzen nicht mehr komplett sind. Da diese Maps aber von einem Parser im Kern erstellt werden und die Elemente die fehlen zu Fehlermeldungen im Parser fuehren wuerden, kann ich von der Seite sagen, dass der Parser alle Elemente zur Verfuegung stellt.

Nun habe ich ein wenig Google benutzt und bin dabei auf die Problematik gestossen, dass Hashmaps nicht umbedingt Threadsafe sind.
Meine Threads bekommen aus der im letzten Kommentar von mir abgebildeten Klasse die Liste von Hashmaps wobei in jedem Thread ueber die Liste iteriert wird und fuer jede Map das Plugin (im selben Thread) ausgefuehrt wird.

Nundenn, wenn die in der Liste enthaltenen Hashmaps Threadseitig das Problem sind (die Liste an und fuer sich kommt ja komplett an, da die Groesse der geschickten Listen korrekt in den Plugins/Threads registriert wird) und mir die Elemente der Hashmaps beim Lesezugriff (keine andere Art ist in den Plugins vorhanden) floeten gehen, muesste ich dann ja 'einfach' die Hashmaps durch eine Threadsichere Datenstruktur ersetzen, welche dann (da die Plugins ueber ein Interface definiert sind, welches von einer Map ausgeht) in den einzelnen Threads in eine solche Hashmap zurueckverwandeln...oder?
 
Hi!

Ich hab mir jetzt nicht genau angesehen, wo das Problem liegt, aber synchronisierte HashMaps bekommst du so:

z.B. so:
Java:
Hashmap objHashmap = Collections.synchronizedMap(new HashMap(....));

Oder aber du verwendest eine Hashtable, die ist schon von Haus aus thread safe!

mfg,

RoCMe
 
Hallo und guten Morgen auch,

danke fuer die zuegige Antwort.

Ich habe es mal mit den Hashtables probiert. Die wandle ich dann in jedem Thread in eine lokale Hashmap um (Im Moment mach ich das nur, indem ich ueber die einzelnen Elemente der Table iteriere und die dann in die Map schmeisse, finde im Moment keine schnellere Loesung). Diese lokale Map wird dann an jedes Plugin in einem Thread weitergegeben.
Dabei habe ich zunaechst eine concurrentModificationException bekommen (wohl klar, waehrend ein Thread auf die Table aus dem parsedModules Objekt zugreift und ein anderer Thread will ebenso verfahren, dann gehts ersmal in die Hose), die Excpetion habe ich nun aber umgangen, indem in ich diese Konvertierung der Table in einem synchronized (parsedModules) Block geschrieben habe.

Und siehe da, ich hab das Tool nun mehrere Male mit hunderten von Dateien ausprobiert und anscheinend sind auch nun die Maps wieder komplett.
Ich werd aber deinen Tipp mit der synchronized Map nochmal ausprobieren, das wuerde mir evtl die Konvertierung ersparen und wahrscheinlich auch den zusaetzlichen synchronized Block..
 
Hallo nochmals,

hier ein kurzes Update:

Ich habe jetzt mal mit Collections.synchronizedMap die Sache ausprobiert.
Funktioniert auch super, die Vorteile:
Kein zusaetzlicher synchronized Block im Thread noetig.
Konvertierung von Map nach HashMap ueber putAll kein Problem.

Wie schon gesagt, eine Konvertierung war noch noetig, da ich der synchronizedMap zwar ne Hashmap uebergeben kann, die aber als Typ Map instanziiert wird/werden muss.

Java:
// Type mismatch: cannot convert from Map to HashMap
HashMap<String, String> resultCdr = Collections.synchronizedMap(new HashMap<String, String>());

//Moeglich
Map<String, String> resultCdr = Collections.synchronizedMap(new HashMap<String, String>());
 
Zuletzt bearbeitet von einem Moderator:
Zurück