Threading - schreiben auf Hashmap/löschen - ConcurrentModificationException

Status
Nicht offen für weitere Antworten.

Kyaha

Mitglied
Hallo alle miteinander!

Ich versuche derzeit eine Hashmap durch 2 Threads zu verwalten.
Dabei soll der erste Thread Daten reinschreiben und der zweite Thread soll sich dann in Intervallen die Daten überprüfen und unnütze Daten rauswerfen.

Dafür wollte ich eine HashMap<String,Long> die einen String einer Milisekundenanzahl zuordnet - sozusagen der "letzte Zugriff".

Nur leider bekomme ich dies leider nicht ohne eine ConcurrentModificationException umgesetzt. Obwohl diese fliegt wird in meiner Hashmap korrekt der Eintrag entfernt, aber ich finde den Fehler einfach nicht.

Anbei der Code meiner zwei Klassen:
Java:
package my.ThreadTest2;

import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;

public class Go extends Thread {

	public static HashMap<String,Long> hmap;
	
	public static void main(String[] args) {
			
		hmap = new HashMap<String,Long>();
		long time = System.currentTimeMillis();
		hmap.put("User1", time);
		hmap.put("User2", time);
		hmap.put("User3", time);
		
		Deleter d = new Deleter(hmap);
		d.start();
		

		System.out.println("1st sleep - 40 sec");
		
		try {
			sleep(1000*40);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("waking up!");
		System.out.println("updating user1 and user 3");

		time = System.currentTimeMillis();
		
		synchronized(hmap) {
			hmap.put("User1",time);
			hmap.put("User3", time);
		}//synchronized
		Iterator<String> it = hmap.keySet().iterator();
		
		String key;
		
		while (it.hasNext()) {
			key = it.next();
			System.out.println("user: " + key + " with last access at " + hmap.get(key));
		}//while
		
		
		System.out.println("2nd sleep - 40 sec");
		
		try {
			sleep(1000*40);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("waking up!");
		
		it = hmap.keySet().iterator();
		while (it.hasNext()) {
			key = it.next();
			System.out.println("user: " + key + " with last access at " + hmap.get(key));
		}//while
		
		System.out.println("updating User3");
		synchronized(hmap) {
			hmap.put("User3", System.currentTimeMillis());
		}//synch
		
		System.out.println("3rd sleep - 60 sec");
		
		try {
			sleep(1000*60);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("Waking up!");
		
		System.out.println("now last should be shown as deleted!");
		
		it = hmap.keySet().iterator();
		while (it.hasNext()) {
			key = it.next();
			System.out.println("user: " + key + " with last access at " + hmap.get(key));
		}//while
		
	}//main
	
	
}//class

Java:
package my.ThreadTest2;

import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;

public class Deleter extends Thread {

	private HashMap<String,Long> h;
	
	public Deleter (HashMap<String,Long> hh) {
		h = hh;
	}//constructor
	
	public void run() {
		
		int sec = 60;
		long time;
		
		String key;
		
		int delay = 1000*30;
		
		while (true) {
			
			try {
				sleep(1000*sec);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}//try catch
			
			time = System.currentTimeMillis();
			synchronized(h) {
			//over the hashmap
			Iterator<String> it = h.keySet().iterator();
			while(it.hasNext()) {
				key = (String) it.next();
				if (h.get(key) < time-delay) {
					System.out.println("user with key " + key + "deleted!\ncurrent time milis " + time + "\nmax delay " + delay);
					System.out.println("last access vom user " + h.get(key));
					
					h.remove(key);
					
				}//if
				
			}//while
			}//synch
			
		}//while
		
		
	}//run
	
}//class

Kann man dies überhaupt so realisieren? Wenn ja, ist der Ansatz soweit korrekt oder befinde ich mich auf dem Holzweg? Wie kommt es zu dieser Exception obwohl doch alles korrekt durchgearbeitet wird?

Vielen Dank für die Mühen im voraus!

Beste Grüße

Kyaha
 

Marco13

Top Contributor
Ohne den Code jetzt im Detail gelesen zu haben: Wenn man mit zwei Threads auf eine Collection zugrift, muss man sicherstellen, dass die Collection synchronized ist.

Im einfachsten Fall geht das, indem man die Zeile
private Map<X,Y> map = new HashMap<X,Y>();
ändert in
private Map<X,Y> map = Collections.synchronizedMap(new HashMap<X,Y>());

Falls du irgendwo mit einer for-Schleife über die Collection iterierst, muss die noch explizit darauf synchronized werden:
Code:
synchronized(map)
{
    for (X x : map.keySet()) { .... }
}
 

Ariol

Top Contributor
Java:
package my.ThreadTest2;

import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;

import org.omg.PortableInterceptor.USER_EXCEPTION;

public class Deleter extends Thread
{

	private ConcurrentHashMap<String, Long>	map;

	public Deleter(ConcurrentHashMap<String, Long> hh)
	{
		map = hh;
	}// constructor

	public void run()
	{

		int minute = 60 * 1000;;
		int delay = minute/2;

		while (true)
		{

			try
			{
				sleep(minute);
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}// try catch

			long time = System.currentTimeMillis();
			// over the hashmap
			Iterator<String> it = map.keySet().iterator();
			while (it.hasNext())
			{
				String key = (String) it.next();
				if (map.get(key) < time - delay)
				{
					System.out.println("user with key " + key + "deleted!\ncurrent time milis " + time + "\nmax delay " + delay);
					System.out.println("last access vom user " + map.get(key));

					map.remove(key);

				}// if
			}// while
		}// while
	}// run
}// class

Java:
package my.ThreadTest2;

import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;

public class Go extends Thread
{

	public static ConcurrentHashMap<String, Long>	map;

	public static void main(String[] args)
	{

		long time = System.currentTimeMillis();

		map = new ConcurrentHashMap<String, Long>();
		map.put("User1", time);
		map.put("User2", time);
		map.put("User3", time);

		Deleter d = new Deleter(map);
		d.start();

		System.out.println("1st sleep - 40 sec");

		try
		{
			sleep(1000 * 40);
		}
		catch (InterruptedException e)
		{
			e.printStackTrace();
		}
		
		System.out.println("waking up!");
		System.out.println("updating user1 and user 3");

		time = System.currentTimeMillis();
		map.put("User1", time);
		map.put("User3", time);
		
		Iterator<String> it = map.keySet().iterator();
		String key;

		while (it.hasNext())
		{
			key = it.next();
			System.out.println("user: " + key + " with last access at " + map.get(key));
		}// while

		
		System.out.println("2nd sleep - 40 sec");
		try
		{
			sleep(1000 * 40);
		}
		catch (InterruptedException e)
		{
			e.printStackTrace();
		}
		System.out.println("waking up!");

		it = map.keySet().iterator();
		while (it.hasNext())
		{
			key = it.next();
			System.out.println("user: " + key + " with last access at " + map.get(key));
		}// while

		System.out.println("updating User3");
		map.put("User3", System.currentTimeMillis());
		
		System.out.println("3rd sleep - 60 sec");
		try
		{
			sleep(1000 * 60);
		}
		catch (InterruptedException e)
		{
			e.printStackTrace();
		}
		System.out.println("Waking up!");

		System.out.println("now last should be shown as deleted!");

		it = map.keySet().iterator();
		while (it.hasNext())
		{
			key = it.next();
			System.out.println("user: " + key + " with last access at " + map.get(key));
		}// while

	}// main

}// class

Mit der richtigen Map brauchst du kein synchronized :wink:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Tarrew Threading - Unregelmäßige Lock-Vergabe Allgemeine Java-Themen 0
Thallius Ist Background-Threading in Java wirklich so schwer? Allgemeine Java-Themen 7
C Threading mit BufferedReader/InputStream & sockets Allgemeine Java-Themen 0
B Threading Allgemeine Java-Themen 23
Luk10 Multi-Threading mit join() Allgemeine Java-Themen 16
R Threading und Rekursion führen zu “GC overhead limit exceeded” Allgemeine Java-Themen 4
SuperSeppel13 Bilder auf Anfrage laden - Threading Allgemeine Java-Themen 3
J Threading / Callables Allgemeine Java-Themen 8
F Threading oder kein Threading - das ist hier die Frage. Allgemeine Java-Themen 23
G Fehlerbereinigung bei Multi Threading Anwedung Allgemeine Java-Themen 2
B Per Java Word Dokument schreiben? Allgemeine Java-Themen 8
Calli11 Was muss ich hier in die Main schreiben, damit das Programm ausgeführt wird? Allgemeine Java-Themen 4
_user_q Eingegebenen Text wiederholt schreiben lassen Allgemeine Java-Themen 9
_user_q JavaFX Robot alle Unicode-Zeichen schreiben lassen können Allgemeine Java-Themen 12
curranux Ausgabe als Textdatei schreiben. Allgemeine Java-Themen 2
B Wie kann ich mein 8 Klassen Gebilde objektorientierter schreiben? Allgemeine Java-Themen 114
Y Wie sinnvolle unit tests schreiben Allgemeine Java-Themen 29
O Test schreiben mit Äquivalenzklassen (Aufgabe Prüfung) Allgemeine Java-Themen 9
S Programm schreiben, das mir aufgrund von Schlagwörtern, die ich im Internet suche, relevante Themen sofort anzeigt. Allgemeine Java-Themen 1
H In jar Resources schreiben? Allgemeine Java-Themen 6
O Wie kann ich in Apache POI (Excel Dateien schreiben) Datumszellen in Excel erzeugen Allgemeine Java-Themen 6
Zrebna Wieviele Testfälle muss man hier schreiben? (Software Engineering) Allgemeine Java-Themen 13
B .txt Datei erstellen und auslesen bzw. schreiben Allgemeine Java-Themen 6
S File lesen und schreiben Java 6 Allgemeine Java-Themen 2
L Erste Schritte Ausdruck schöner schreiben? Allgemeine Java-Themen 8
G Excel File öffnen, in Zelle schreiben, abspeichern Allgemeine Java-Themen 6
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
ralfb1105 Blöcke aus Datei filtern/suchen und in neue Datei schreiben Allgemeine Java-Themen 10
D HTTP Http-Link mittels GUI schreiben Allgemeine Java-Themen 5
M In Textdatei schreiben Allgemeine Java-Themen 3
S Input/Output Beste Möglichkeit einen String in einen Datei zu Schreiben Allgemeine Java-Themen 2
Aruetiise " in Datei schreiben Allgemeine Java-Themen 2
D Möglichkeit mit GAE eine Table auszulesen und eine csv zu schreiben Allgemeine Java-Themen 22
K Zusammenfassungen schreiben Allgemeine Java-Themen 2
OnDemand Desktop-Applikation schreiben, wie daten persistent? Allgemeine Java-Themen 9
KeVoZ_ Nacheinander folgende Strings in Textdokument auf neue Zeile schreiben Allgemeine Java-Themen 6
MiMa Log4j in Dateien mit eigenem Namen schreiben Allgemeine Java-Themen 3
A 2D-Grafik Text in ein Bild schreiben Allgemeine Java-Themen 11
M Makrocode von OO in Java schreiben Allgemeine Java-Themen 5
B Animierte Klasse schreiben - Wie? Allgemeine Java-Themen 9
X NetBeans Bilder und andere Dateien ins .jar schreiben und wieder aus .jar lesen Allgemeine Java-Themen 6
D Daten in MySQL-Datenbank schreiben Allgemeine Java-Themen 13
R Signatur von Methoden in eine Datei schreiben? Allgemeine Java-Themen 4
F Fehler in Zeile in Log schreiben Allgemeine Java-Themen 6
F Lesen effizienter als schreiben? Allgemeine Java-Themen 4
H jid3lib nach schreiben keine Tags im Folder angezeigt Allgemeine Java-Themen 1
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
B Fortschritt beim Schreiben einer Datei ausgeben lassen Allgemeine Java-Themen 7
F Wert in Variable schreiben, wenn diese gerade genutzt wird Allgemeine Java-Themen 10
U Tiefe Objekte schreiben Allgemeine Java-Themen 1
M Input/Output Datei Schreiben Allgemeine Java-Themen 3
V Eclipse Ich kann bei eclipse nicht schreiben Allgemeine Java-Themen 1
Tobse HTTP REST API's in SQL schreiben Allgemeine Java-Themen 1
B Übergebene Werte in Gerätedatei schreiben Allgemeine Java-Themen 2
2 String Array in Datei schreiben und wieder davon lesen Allgemeine Java-Themen 2
M Methoden jRegistryKey und in die Regitrey schreiben Allgemeine Java-Themen 5
M Text in erstelltes Excelfile schreiben Allgemeine Java-Themen 6
A In Excel-Datei schreiben, Formeln der Mappe anwenden, Wert lesen Allgemeine Java-Themen 3
F Linux & NetBeans: Datei in Systemverzeichnis schreiben? Allgemeine Java-Themen 1
A Input/Output Spätes Schreiben von Dateien der JVM Allgemeine Java-Themen 3
T Input/Output Daten in eine Datei schreiben Allgemeine Java-Themen 4
E wav Datei schreiben mit AudioInputStream Allgemeine Java-Themen 3
T Excel - mit jxf sprachabhängige Formeln schreiben Allgemeine Java-Themen 2
S Java-Programm für "Börsenanalyse" schreiben Allgemeine Java-Themen 4
W Schreiben/Lesen aus RS232 / jssc Allgemeine Java-Themen 0
B Text in die Mitte der Konsole schreiben. Allgemeine Java-Themen 1
L Input/Output Datei einlesen und Inhalt in Array schreiben Allgemeine Java-Themen 3
D Datei in Jar schreiben Allgemeine Java-Themen 5
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
MiMa Liste von Pfaden in eine textArea schreiben Allgemeine Java-Themen 7
O Entwicklungshandbuch schreiben Allgemeine Java-Themen 2
S Swing Text in eine JTextArea schreiben Allgemeine Java-Themen 17
O Collections StringSplit und in anderen String schreiben Allgemeine Java-Themen 8
Iron Monkey Inhalt von JTable in die Textdatei mit StringWidth schreiben Allgemeine Java-Themen 3
M Symmetrischen "KeyGenerator" schreiben Allgemeine Java-Themen 2
B Großes Projekt "gut" schreiben Allgemeine Java-Themen 22
F Sachen in datei schreiben Allgemeine Java-Themen 2
G Binäre Datei lesen / schreiben Allgemeine Java-Themen 9
M ImageJ: Mit PlugIn Weichzeichnungsfilter schreiben Allgemeine Java-Themen 9
S Threads Abarbeitungsstatus von Threads in Datei schreiben Allgemeine Java-Themen 2
A DOM Datei schreiben Allgemeine Java-Themen 3
F In ein Textfeld im Browser schreiben? Allgemeine Java-Themen 4
Chumax Datei als Admin schreiben Allgemeine Java-Themen 5
S Von einer ArrayList in die andere schreiben? Allgemeine Java-Themen 6
I Eigenes Mail-Programm schreiben Allgemeine Java-Themen 21
S eigene regEx schreiben Allgemeine Java-Themen 4
E Performanceverlust beim Schreiben von ResultSet in txt Datei Allgemeine Java-Themen 10
F In mitten einer Textdatei schreiben Allgemeine Java-Themen 7
B Java Plugin schreiben Allgemeine Java-Themen 11
R Datei zeilenweise lesen und schreiben Allgemeine Java-Themen 6
D Java Excel API - Schreiben in Excel lässt sich nicht über Makro starten Allgemeine Java-Themen 18
S Runtime Exceptions in eine Datei schreiben Allgemeine Java-Themen 7
S Exception beim Schreiben des Dataset in XML Datei Allgemeine Java-Themen 8
B OOP java.util.logging.Logger: Wie kann ich mehre Klassen in ein Logfile schreiben lassen? Allgemeine Java-Themen 12
I kleines Wochenlohn-Programm schreiben Allgemeine Java-Themen 5
M Problem beim schreiben einer eigene generische Klasse Hashtable Allgemeine Java-Themen 11
C Eigene Sounddateien schreiben Allgemeine Java-Themen 12
das-mo FunktionsParser schreiben Allgemeine Java-Themen 32
M Problem beim schreiben einer eigene generische Klasse LinkedList Allgemeine Java-Themen 34
J HSSF - schreiben in und lesen aus vorhandener Datei Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben