Verkettete Liste

Status
Nicht offen für weitere Antworten.

renek

Mitglied
Hallo zusammen

Ich habe folgendes Problem. Ich habe mir eine Klasse (buffer) gebastelt, die mir eine einfach verkettete Liste erzeugt. Soweit geht auch noch alles.

Ich lege 2 Listen an ( new buffer() ). Diese 2 Listen übergebe ich 3 Threads. Dem ersten beide Zeiger auf die Listen und den anderen beiden jeweils nur einen Zeiger. Der erste Thread schreibt abwechselnd Daten in einen der beiden Listen. Sobald in einer Liste Daten da sind, holen die entsprechenden Threads die Daten aus der Liste und zeigen sie an. Leider kommt es bei mir vor, das falsche Daten ausgelesen werden.
Wie kann ich sicherstellen, dass immer nur ein Thread auf die Listen zugreift? Bei mir kommt immer ein Error wenn Thread2b auf die Liste zugreifen will.

E:\testing java>java TextThreadDemo
Ende TextThreadDemo
Thread1 in b1 (1/0): test b1
Thread1 in b2 (0/1): test b2
Thread2a Länge: 0 --- Daten: test b1
Thread1 in b1 (1/1): test b1
Thread2a Länge: 0 --- Daten: test b1
Thread2b: () !!!!!!!!!!!!!!!!!!!! ERROR !!!!!!!!!!!!!!!!!!!!!!!
Thread1 in b2 (0/1): test b2
Thread1 in b1 (1/1): test b1
Thread2b: () !!!!!!!!!!!!!!!!!!!! ERROR !!!!!!!!!!!!!!!!!!!!!!!
Thread2a Länge: 0 --- Daten: test b1
Thread1 in b2 (0/1): test b2
Thread1 in b1 (1/1): test b1
Thread2b: () !!!!!!!!!!!!!!!!!!!! ERROR !!!!!!!!!!!!!!!!!!!!!!!
Thread2a Länge: 0 --- Daten: test b1
Thread1 in b2 (0/1): test b2
Thread1 in b1 (1/1): test b1


Code:
public class data_test {
	data_test next_data;			// Referenz auf nächstes Objekt

	String command;
    
	
	public data_test () {
		this.next_data = null;
		this.command = "";
	}
}

Code:
class buffer_test {
	data_test first_data;
	data_test last_data;

    volatile int length = 0;
	
	public buffer_test () {
		first_data = null;
		last_data = null;
	}
	
	public synchronized void write_data (data_test daten) {
		if (first_data == null) {
			// Noch kein Element vorhanden
			first_data = daten;
			last_data = daten;
		}
		else {
			last_data.next_data = daten;		// altes letztes Element verketten
			last_data = daten;					// neues letztes Element setzen
    	        }
	        length++;
	}

	public synchronized data_test read_data () {
	   // Erstes Element löschen
	    data_test daten;

		if (first_data != null) {
			// Es ist mind. noch 1 Element in der Kette vorhanden
			daten = first_data;
			if (first_data.next_data == null) {
				// Nur noch 1 Element in der Kette vorhanden
				first_data = null;
				last_data = null;
			}
			else {
				// Es sind noch mehr Elemente in der Kette
				first_data = first_data.next_data;
			}
		    length--;

		    return daten;
		}
	    return null;
	}


    public synchronized int length() {
    	return length;
    }
}

Code:
public class TextThreadDemo {
	public static void main(String args[]) {
		
		TextThread1 output;
		TextThread2a input1;
		TextThread2b input2;
		
		buffer_test buf1 = new buffer_test();
   		buffer_test buf2 = new buffer_test();
		
		output = new TextThread1(buf1,buf2);
		input1 = new TextThread2a(buf1);
                input2 = new TextThread2b(buf2);

		output.start();
		input1.start();
   		input2.start();
		
		System.out.println ("Ende TextThreadDemo");
	}
}

Code:
class TextThread1 extends Thread {
    buffer_test b1,b2;
    data_test daten;
    public String name1 = "test_";
    
    public TextThread1(buffer_test buf1, buffer_test buf2) {
		super("TextThread1");
		b1 = buf1;
	    b2 = buf2;
    }

	public void run() {
	    for(int i = 0; i < 50; i++) {
			try {
				if (i % 2 == 0) {
					daten = new data_test();
				    daten.command = "test b1";
				    
					b1.write_data (daten);
				    System.out.println ("Thread1 in b1 (" + b1.length() + "/" + b2.length() + "): " + daten.command);
			    }
			    else {
			    	daten = new data_test();
				    daten.command = "test b2";
				    
					b2.write_data (daten);
				    System.out.println ("Thread1 in b2 (" + b1.length() + "/" + b2.length() + "): " + daten.command);

			    }
		    }
		    catch (IllegalMonitorStateException e) {
		    	System.out.println ("Fehler(1): b Monitor war besetzt");
		    }
		}
		daten = new data_test();
	    daten.command = "ENDE";
    	b1.write_data (daten);

	    daten = new data_test();
	    daten.command = "ENDE";
    	b2.write_data (daten);

	    System.out.println ("Thread 1 Ende");
	}
}

Code:
class TextThread2a extends Thread {
    String text = "Thread 2";
    buffer_test b;
	data_test daten;
	String com = "";
    
    public TextThread2a(buffer_test buf) {
		super("TextThread2");
		b = buf;
    }
  
	public void run() {
		
		String com = null;

		try {
			daten = b.read_data();
		    if (daten != null) {
		    	com = daten.command;
		    }

	    }
	    catch (IllegalMonitorStateException e) {
			System.out.println ("Fehler(2): b Monitor war besetzt");
		}
		while (com != "ENDE") {
			try {
				//b.show_data();			
				daten = b.read_data();
    		    if (daten != null) {
			    	com = daten.command;
				    if (com.equals("test b1")) {
					    System.out.println ("Thread2a Länge: " + b.length() + " --- Daten: " + com);
				    }
				    else {
				    	System.out.println ("Thread2a: (" + com + ") !!!!!!!!!!!!!!!!!!!! ERROR !!!!!!!!!!!!!!!!!!!!!!!");
				    }
			    }
			    else {
			    	com = "";
			    }

			try {
				sleep(100);
			}
				catch(InterruptedException e) {
			}
			    
		    }
		    catch (IllegalMonitorStateException e) {
		    	System.out.println ("Fehler(2): b Monitor war besetzt");
		    }
			

		}	// Ende while

		System.out.println("Thread 2a Ende");
	}
}

Code:
class TextThread2b extends Thread {
    String text = "Thread 2";
    buffer_test b;
	data_test daten;
	String com = "";
    
    public TextThread2b(buffer_test buf) {
		super("TextThread2");
		b = buf;
    }
  
	public void run() {
		
		String com = null;

		try {
			daten = b.read_data();
		    if (daten != null) {
		    	com = daten.command;
		    }

	    }
	    catch (IllegalMonitorStateException e) {
			System.out.println ("Fehler(2): b Monitor war besetzt");
		}
		while (com != "ENDE") {
			try {
				//b.show_data();			
				daten = b.read_data();
    		    if (daten != null) {
					if (com.equals("test b2")) {
					    System.out.println ("Thread2b Länge: " + b.length() + " --- Daten: " + com);
				    }
				    else {
				    	System.out.println ("Thread2b: (" + com + ") !!!!!!!!!!!!!!!!!!!! ERROR !!!!!!!!!!!!!!!!!!!!!!!");
				    }			    }
			    else {
			    	com = "";
			    }

			try {
				sleep(100);
			}
				catch(InterruptedException e) {
			}
			    
		    }
		    catch (IllegalMonitorStateException e) {
		    	System.out.println ("Fehler(2): b Monitor war besetzt");
		    }
		}	// Ende while

		System.out.println("Thread 2b Ende");
	}
}
 

Marco13

Top Contributor
Hab's nur überflogen (unübsichtlich, schlecht eingerückt, scheußliche Variablen- und Klassennamen (Klassennamen Groß schreiben, Veriablennamen OHNE "_" Unterstrich), fehlerhafte Abfragen (while (com != "ENDE") is böse - Strings muss man mit "equals" vergleichen: while (!"ENDE".equals(com)), überflüssige Exceptions gefangen (eine IllegalMonitorStateException ist eigentlich ein Programmierfehler, und sollte nicht gefangen werden müssen)), aber .... zum eigentlichen Problem:

Kann es sein, dass du davon ausgehst, dass die beiden Threads sich die Daten abwechselnd abholen? Und kann es sein, dass die Threads immer davon ausgehen, dass Daten vorhanden sind? Es gibt (wenn ich das richtig überflogen habe) keinen Mechanismus, der das eine oder das andere sicherstellt....
 

renek

Mitglied
Hi Marco

Also über Namensgebung kann man streiten. Ich will ja kein Literaturnobelpreis :wink: bekommen . Die Listings sind nur Testprogramme. Die Einrückungen sind durchs kopieren gekommen. Das Formular hier kennt irgendwie kein Tab :?.
Das mit EQUALS hab ich übersehen. Ist bei mir auch schon geändert.
Das mit der IllegalMonitorStateException kommt daher, da ich auf einem Java-Controller programmiere und da zu Beginn SEHR viele Bugs in der Firmware waren. Man konnte nicht sagen, ob es ein Programmfehler war oder ein Firmwarefehler :? . Am Angang ging nicht mal "synchronized" richtig.

Ich gehe von eigentlich von nichts aus. Die 3 Threads können laufen wann sie wollen. Ich schreibe nur abwechselnd in die beiden Listen, das die beiden anderen Threads was haben. Aber wann sie die Daten von den Listen abholen ist nicht festgelegt.

Was das vorhandensein von Elementen angeht. Die Threads versuchen einfach ein Element zu lesen und wenn NULL zurückkommt war halt keins da.

Wenn ich nur eine Liste benutze in die ein Thread reinschreibt und ein andere Thread ausliest klappt alles wunderbar. Nur bei zwei oder mehr Listen kommen die Fehler. Sind die Listen intern irendwie verknüpft?

gruß

renek
 
G

GastsaG

Gast
Setze doch die beiden Attribute deiner data-Klasse auf private und mach synchronized getter und setter darauf. Hilft vielleicht.

und zum Thema Namensgebung: die Namensgebung und Einrückung ist nicht für den Literaturnobelpreis wichtig, sondern dafür, dass man deinen Quellcode hier liest und so schnell wie möglich versteht. Ich hatte nämlich auch keine Lust das Zeug grossartig zu analysieren.
 

renek

Mitglied
Hi GastsaG

Dein Tipp mit Setter und Getter hat geholfen. Meine ersten Tests verliefen gut :D. Im nachhinein erscheint es auch logisch. Meine data Klasse war nicht geschützt. Ich dachte weil ich nur über die buffer Klasse zugreife würden sich da keine Probleme ergeben.
Habe jetzt die Variablen auf private gesetzt und greife nur noch über synchronized Methoden darauf zu.

Muss jetzt die Änderung nur noch im Projekt umsetzen. Wird aber eine Weile dauern. Dort sind es immerhin 7 Threads die auf insgesamt 5 Listen zugreifen.

Danke allen noch für die Tipps.

Gruß renek
 

renek

Mitglied
Morgen zusammen

Nach Umbau des ganzen Projekts kam die Ernüchterung. Es treten immernoch Fehler auf. Jetzt habe ich aber ein genaueres Fehlerbild.

Wenn der Aufbau folgendermassen ist
Code:
T1 ---> Buffer1 ---> T2
   |
   ---> Buffer2 ---> T3
Also ein Thread reinschreibt und zwei rausholen geht alles. Aber wenn es so ist,

Code:
T1 ---> Buffer 1 ---> T2  ---> Buffer2 ---> T3
                          |
                          ---> Buffer3 ---> T4
dass ein Thread in einen Buffer schreibt, ein anderes es rausholt und dann die Daten in zwei andere Buffer verteilt, geht was bei T2 schief. Bei T3/T4 kommen hin und wieder Daten an, die noch von T1 stammen. Es scheint fast so, als ob die 3 Buffer verbunden wären. Es gibt wohl irgendwo ein Pointerquerverweis.
Es scheint mir ein Systematischer Fehler zu sein. Vielleicht hat ja jemand eine Idee, warum die 3 Listen trotzdem irgendwie verbunden sind.
Die data-Klasse habe ich wie oben beschrieben abgeändert.

Gruß renek
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M einfach verkettete Liste verstehen Allgemeine Java-Themen 23
K verkettete Liste Allgemeine Java-Themen 3
OSchriever Einfach verkettete Liste ändern Allgemeine Java-Themen 43
K Einfache Verkettete Liste mit Node Allgemeine Java-Themen 3
S Verkettete (Teil)Liste sortieren ( rekursiv bis n) Allgemeine Java-Themen 2
Z Sortiertes Einfügen in doppelt verkettete Liste Allgemeine Java-Themen 5
D Einfach verkettete Liste Allgemeine Java-Themen 3
R doppelt verkettete Liste: Fehler beim Einfügen Allgemeine Java-Themen 3
chik Doppelt verkettete Liste bzw. Zirkulärliste (kleiner Fehler, den ich nicht finde) Allgemeine Java-Themen 4
X einfach verkettete Liste und Insertion Sort Allgemeine Java-Themen 3
F Doppelt verkettete Liste sortieren? Allgemeine Java-Themen 8
M Schlange als verkettete Liste Allgemeine Java-Themen 4
J Doppelt verkettete Liste Allgemeine Java-Themen 6
M doppelt verkettete Listen Allgemeine Java-Themen 2
T Verkettete Suche Allgemeine Java-Themen 6
J Rekursion oder Iteration - verkettete Listen Allgemeine Java-Themen 8
L verkettete Listen oder Arrays + Indexlisten effizienter? Allgemeine Java-Themen 3
L Doppelt Verkettete Listen Allgemeine Java-Themen 6
E Verkettete Listen Allgemeine Java-Themen 5
M doppelt verkettete Listen? Allgemeine Java-Themen 5
Fynn29 Liste sortieren ohne Array und ohne vorgegebene Sortierung Allgemeine Java-Themen 2
MiMa Filtern von TableView Liste Allgemeine Java-Themen 2
B Liste aller Kombintionen mit Einschränkungen Allgemeine Java-Themen 8
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Liste ändern während Iteration über Diese? Allgemeine Java-Themen 16
D Erste Schritte Liste erweitern Allgemeine Java-Themen 11
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
L allgemein Strings händisch in Liste sortieren Allgemeine Java-Themen 47
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
Gaudimagspam Skip Liste erstellen in Java Allgemeine Java-Themen 3
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
bueseb84 Spring Boot Entity mit Liste Allgemeine Java-Themen 4
MiMa Werte in liste speichern? Allgemeine Java-Themen 3
Curtis_MC Collections Liste anhand mehrere Kriterien sortieren Allgemeine Java-Themen 6
G Liste (UsageStats) sortieren (Android) Allgemeine Java-Themen 5
T Google Links in einer Liste Allgemeine Java-Themen 4
looparda Liste filtern nach Prädikaten verschiedener Typen Allgemeine Java-Themen 3
L Liste überschreibt alte Elemte Allgemeine Java-Themen 10
H Länge einer verketteten Liste Allgemeine Java-Themen 4
E Erstellen einer Liste mit einer maximalen Menge an Elementen Allgemeine Java-Themen 13
P Element einer Liste wurde hinzugefügt, aber es gibt keinen Zugriff Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
L Erste Schritte Liste von Datums filter nach Monate Allgemeine Java-Themen 4
Y Liste in Stream Packen Allgemeine Java-Themen 1
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
perlenfischer1984 Liste mit generics zurück liefern Allgemeine Java-Themen 8
G Liste zwischen zwei Kalenderdaten erstellen Allgemeine Java-Themen 3
B Wie vergleiche ich Strings in einer Liste? Allgemeine Java-Themen 5
Viktim Threads Liste In unterschiedlichen Threads bearbeiten Allgemeine Java-Themen 23
A Collections Inhalt einer Liste mit Inhalt anderer Liste vergleichen ? Allgemeine Java-Themen 7
I Abstrakte Datentypen - Liste Allgemeine Java-Themen 9
D Datentypen Klassenattribut aus Objekt in generischer Liste Allgemeine Java-Themen 15
P Liste zu Objekt umwandeln Allgemeine Java-Themen 4
Z In die Liste kann ich nichts adden Allgemeine Java-Themen 16
C Liste checken auf MINDESTENS ein Objekt | Bukkit Allgemeine Java-Themen 3
M liste von listen anders ausgeben Allgemeine Java-Themen 1
B Per Buttonklicks einer Liste Wörter hinzufügen - Wie umsetzen? Allgemeine Java-Themen 11
H Liste sortieren anhand optionalem Property Allgemeine Java-Themen 3
L Liste führt sich nicht weiter Allgemeine Java-Themen 5
A Input/Output Liste der Dateien in einem Ordner in einer Jar Datei erhalten Allgemeine Java-Themen 11
J Fragen zu generischer doppelt verketteter Liste (bei fehlendem Grundverständnis) Allgemeine Java-Themen 1
B Prüfen, ob ein Element in der Liste nicht existiert Allgemeine Java-Themen 3
B Klassen JTable mit einer Liste Allgemeine Java-Themen 0
X HTTP Auslesen der Ergebnisse von einer Webseite und in eine Liste packen Allgemeine Java-Themen 1
A Auslesen einer Datei sowie ausgeben als Liste in App Allgemeine Java-Themen 5
E Liste löscht sich selbstständig Allgemeine Java-Themen 5
H Liste von Objekten generisch sortieren Allgemeine Java-Themen 0
D Liste anhand Standardnormalverteilung befüllen Allgemeine Java-Themen 1
M Threads synchroner Zugriff (add/delete/read) auf eine Liste Allgemeine Java-Themen 6
T Datentypen Eine Liste - verschiedenen Klassen - eine Abstracte Klasse Allgemeine Java-Themen 3
M Werte aus DB in Liste speichern ohne mehrfach speicherung Allgemeine Java-Themen 18
G Liste anzahl der gleichen Objekte Allgemeine Java-Themen 6
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
O aus Liste ein beliebiges Element auswählen Allgemeine Java-Themen 7
J Liste aller Com-Ports - zweistellige Ports? Allgemeine Java-Themen 15
O MVC - wo Liste der ComboBox-Items ermitteln Allgemeine Java-Themen 3
MiMa Liste von Pfaden in eine textArea schreiben Allgemeine Java-Themen 7
K kontinuierlich aktuelle Bestellsystem-Liste mit farbigem Status Allgemeine Java-Themen 2
A Auswählbare Liste Allgemeine Java-Themen 2
D Sortieren von Liste zu unperformant Allgemeine Java-Themen 6
N Liste gesucht Allgemeine Java-Themen 2
S Probleme beim Auslesen einer Liste Allgemeine Java-Themen 8
O JSON String bauen aus Liste Allgemeine Java-Themen 2
M Über Liste verschiendene JComponents mit eigenem implementierten Interface ansprechen Allgemeine Java-Themen 7
T Hashmap mit geordneter/ungeordneter liste als Value Allgemeine Java-Themen 5
D Zugriff auf Array-Liste Allgemeine Java-Themen 19
S Threads Liste mit Objekten in Teillisten zerlegen und abarbeiten Allgemeine Java-Themen 3
R ThreadPool - vorhandene thread liste überprüfen bzw. aufräumen Allgemeine Java-Themen 3
pg1337 Liste füllen Allgemeine Java-Themen 2
U Große Liste von Strings mit indiziertem Zugriff Allgemeine Java-Themen 31
B Properties File Liste Allgemeine Java-Themen 3
Gossi Collections Liste zusammenfassen für JSP Allgemeine Java-Themen 4
Gossi Collections (Unbekannte) Liste Sortieren Allgemeine Java-Themen 10
T Collections Liste schnell/nebenläufig durchgehen Allgemeine Java-Themen 2
M Objekt aus Liste in Liste suchen/löschen Allgemeine Java-Themen 6
Q "Doppelte" Einträge einer Liste entfernen Allgemeine Java-Themen 14
C Exponentielle Verteilung in einer Liste Allgemeine Java-Themen 7
Nic.o liste der installierten Zertifikate ?! Allgemeine Java-Themen 3
T Liste mit GregorianCalendar-Objekten in List einlesen, mit Collection sortieren und ausgeben Allgemeine Java-Themen 3
M Verständnisfragen bezüglich Liste Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben