Java Thread [blockingqueue] hängt sich auf

Lord_Aratorn

Aktives Mitglied
Hi, Ich habe 2 verschiedene Threads, der eine empfängt UDP-Packete vom Netzwerk und soll sie in seine interne Queue schreiben.
Der Andere soll aus dieser Queue lesen und anschließend das erhaltene Packet weiter behandeln. Jedoch zerschießt sich Thread1, wenn eine Methode auf der Referenz des erhaltenen Packets ausgeführt wird.
Ich habe den etsprechenden Code unten gepostet.

In einem weiteren Ausschnitt des gesammten Projektes gibt es einem anderen Thread der genauso arbeitet wie Thread1. Dieser funktioniert jedoch tadellos. Ich vermute daher ein Problem mit der Threadinteraktion.

Danke für Eure Hilfe.
Java:
//Thread1
DatagramPacket packet = null;
while (true) {
			try {
				packet = lnS.getReceivedmessage();
				System.err.println("testausgabe 1");// wird noch ausgegeben
				System.out.println("packetdata:"+packet.getData());// hier hängt er sich weg
				
				InetAddress senderAddress = packet.getAddress();
				bmP.deserialize(packet.getData());
				handleIncommingMessagetype(senderAddress, bmP);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

Java:
//Thread2
	private BlockingQueue<DatagramPacket> receivedMessages = new LinkedBlockingQueue<DatagramPacket>();
        /*** nimmt erhaltenes DatagramPacket aus der Blockingqueue***/
	public DatagramPacket getReceivedmessage() throws InterruptedException {
		this.packet =receivedMessages.take();
		if (verbose)
			System.out.println("LNS: packet entnommen");
		return this.packet;
	}
 

FArt

Top Contributor
Was heißt "der Thread zerschießt sich". Hilft ein ThreadDump, damit du siehst wo ein Thread "hängt"? Auf jeden Fall hilft Logging!

Im Prinzip ist das ein Standard: Producer-Consumer Problem... Google hilft da weiter...
 

Lord_Aratorn

Aktives Mitglied
Was heißt "der Thread zerschießt sich". Hilft ein ThreadDump, damit du siehst wo ein Thread "hängt"? Auf jeden Fall hilft Logging!
Ich habe geloggt, und dies auch schon am Anfang im Eröffnungspost geschildert.
Nur kann ich mir nicht erklären warum und darum schreibe ich hier im Forum.
Mich würde es wundern, wenn das Objekt, welches von der getReceivedMessage-Methode zurückgeliefert wird, nicht vollständig ist. Da die Queue aus der das Objekt entnommen wird eine LinkedBlockingQueue ist und somit threadsave sein sollte.

Im Prinzip ist das ein Standard: Producer-Consumer Problem... Google hilft da weiter...
Würde ich bezweifeln, weil soweit ich weiß, Producer und Consumer nicht übers Netzwerk communizieren.
 
Zuletzt bearbeitet:

miwoe

Mitglied
a) Ich sehe nicht, wo die Queue beschrieben wird.

b) Du hast immer noch nicht beschrieben, was für dich weghängen bedeutet, dass ist Gamer-Slang :D Richtig wäre sowas wie Deadlock, Livelock, Exception

Mein Tipp: Log mehr. Aus den Codeschnipseln kann man nicht viel erkennen. Ich sehe zum Beispiel keine 2 Threads arbeiten, sondern nur einen Methodenaufruf vom oberen zum unteren Code-Schnipsel. Zumindest wenn ich
Code:
packet = lnS.getReceivedmessage();
richtig deute...., was auch immer lnS ist.
 

Murray

Top Contributor
Bedeutet "weghängen", dass die entsprechende Ausgabe, die aus dieser Codezeile resultieren sollte, nicht mehr in der Konsole erscheint? Hast Du den Code schon mal im Debugger laufen lassen?
 
Zuletzt bearbeitet:

Lord_Aratorn

Aktives Mitglied
Bedeutet "weghängen", dass die entsprechende Ausgabe, die aus dieser Codezeit resultieren sollte, nicht mehr in der Konsole erscheint? Hat Du den Code schon mal im Debugger laufen lassen?

Genau, das bedeutet, dass die 2te Ausgabe nicht stattfindet.
Ja, ich habe debuggt. Nur kann ich nicht ersehen wo der Fehler ist. Der Step into "sysout" endet direkt in einer "source not found exception", die von systemout stammt, da die binaries nur vorhanden sind. Wo wir übrigens bei Exception sind. Es wird keine Exception geworfen. Dies macht mich zudem sehr stutzig.

lns (unten beschrieben) ist wohl der Name der Referenz, des Threads, welcher die Methode getReceivedMessage() beinhaltet (die ich im übrigen ja auch gepostet habe), welche wohl die LinkedBlockingQueue nutzt um daraus "DatagramPackets" zu lesen.

@miwoe
1) Schau nochmal genau hin! Sie ist im 2ten Codeschnipsel (der kommentiert wurde gleich an Anfang referenziert und instanziert worden).
2) Du hast wahrscheinlich recht, dass zu sehr informatiker-slang ist. Aber ich weiß halt nichtmal ob es überhaupt ein Lock ist, da alle Threads ohne Exception weiterarbeiten. Ich jedoch nicht an die übermittelten Informationen in dem DatagrammPacket komme.
ps) Ich habe in den Kommentaren gesagt, dass ich 2 Threads habe, dies sollte reichen. Ich habe die Claas, in der Codeschnipsel 1 enthalten ist, von Thread abgeleitet. Genauso, wie die Class aus der Codeschnipsel 2 stammt (lns = LeafNodeServer) womit auch beantwortet ist, dass es der Thread ist, der auf den Netzwerk horcht.


Zu viel Code kann ich nicht veröffendlichen, da der Code Teil eines Projektes ist.
 

miwoe

Mitglied
Wie auch immer. Ich glaube nicht, dass das Problem die BlockingQueue ist. Eher hat es was mit der Übertragung zu tun. Was ist, wenn du versuchst die Daten des DatagramPacket von dem Thread zu loggen, der es in die Queue schreibt? Das wäre so dass, was ich als nächstes überprüfen würde.
 

Lord_Aratorn

Aktives Mitglied
Um mehr Verständnis zu erzeugen, poste ich mal den wichtigen Teil des LNS:

Java:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class LeafNodeServer extends Thread {
	private final int packetSize = 256;
	
	private static LeafNodeServer instance = null;

	private int port = 0;
	
	private DatagramPacket packet = null;
	private DatagramSocket socket = null;
	private BlockingQueue<DatagramPacket> receivedMessages = null;
		
	private boolean verbose = false;


	public static LeafNodeServer getLeafNodeServer(int port) {
		if (instance == null) {
			instance = new RootNodeServer(port);
		}
		return instance;
	}

	private LeafNodeServer(int port) {
		this.port = port;
		this.receivedMessages = new LinkedBlockingQueue<DatagramPacket>();
		this.packet = new DatagramPacket(new byte[packetSize],packetSize);
		try {
			this.socket = new DatagramSocket(this.port);
		} catch (SocketException e) {
			System.err.print("LeafNodeServer.constructor");
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		super.run();
		while(true){
			try {
				this.socket.receive(packet);
				this.receivedMessages.put(packet);
				if (verbose){
					System.out.println("LNS: received packet content: "+new String(packet.getData()));
					}
//				this.join();
			} catch (Exception e) {
				System.err.print("LeafNodeServer.run");
				e.printStackTrace();
			}
		}

	}

	public DatagramPacket getReceivedmessage() throws InterruptedException {
		DatagramPacket p = receivedMessages.take();
		System.out.println("LNS: take " + new String(p.getData()));
		return p;
	}
	
	public synchronized void verbose() {
		this.verbose = true;
	}
}
[/Java]

Ich habe das Problem bis in Zeile 62 eingrenzen können (auch hier wird die Ausgabe nicht durchgeführt). Es scheint so, als wäre das Objekt, welches aus der Queue entnommen wird deffekt. 
In der Queue scheint ein Packet enthalten zu sein, zumindest wird die Ausgabe in Zeile 49 erfolgreich ausgeführt, wenn ein Paket erhalten wurde.

[code]
[toString() unavailable - no suspended threads]
ist nach ausführen der Ausgabe in Zeile 62 im DatagramPacket (packet) der Wert in allen Variablen des Packets
 
Zuletzt bearbeitet:

Lord_Aratorn

Aktives Mitglied
Ok, ich habe den Fehler gefunden.

Das Problem lag darin, dass für jedes empfangene Paket das selbe DatagramPacket-Objekt genutzt wurde.
Ich weiß zwar nicht, warum dadurch ein Problem entsteht. Ich vermute mal, dass wenn ein Packet den Server erreicht, bevor ein Anderes verarbeitet wurde, das alte Objekt zerstört wird.
 

Empire Phoenix

Top Contributor
this.socket.receive(packet);
this.receivedMessages.put(packet);

simple ein Datagrampacket hat im kern ein bytearray als speicher, arrays sind in java nicht primitiv, dh call by reference -> wenn du die daten änderst werden alle referenzen die die daten verwended ad absurdum geführt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
P Swing Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: npoints > xpoints.length || npoints > ypoints.length Allgemeine Java-Themen 5
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
V Compiler-Fehler Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 125, Size: 125 Allgemeine Java-Themen 11
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
B Threads Java Thread kommunizieren Allgemeine Java-Themen 12
N java.lang.IllegalMonitorStateException: object not locked by thread before notify() Allgemeine Java-Themen 2
S java.util.ConcurrentModificationException - aber nur ein Thread Allgemeine Java-Themen 3
P Java Probleme - java.lang.Thread.run(Unkown Source) Allgemeine Java-Themen 10
D Java Thread, Bild wird nur am Ende gezeichnet Allgemeine Java-Themen 5
N Exception in thread "main" java.lang.UnsatisfiedLinkError: no lwjgl in java.library.p Allgemeine Java-Themen 4
R Java Thread Allgemeine Java-Themen 4
A java logging api scheint nicht thread save zu sein Allgemeine Java-Themen 22
E Java.net und Thread-Problem Allgemeine Java-Themen 2
P 64 Bit Java Anwendungen - Allgemeiner Thread Allgemeine Java-Themen 38
J Exception in thread "main" java.lang.OutOfMemoryEr Allgemeine Java-Themen 26
S Exception in Thread "main" java.lang.NoClassDef. b Allgemeine Java-Themen 2
J java Thread java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 7
B Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 12
D java.lang.IllegalMonitorStateException: current thread not Allgemeine Java-Themen 3
M Thread Dump Java VM Allgemeine Java-Themen 5
P Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 3
P Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 15
P Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 3
B Exception in thread "main" java.lang.OutOfMemoryEr Allgemeine Java-Themen 5
S Exception in thread "main" java.lang.StringIndexOu Allgemeine Java-Themen 9
E Exception in Thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 5
OnDemand Java Deployment Vaadin Allgemeine Java-Themen 3
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
Zrebna Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention? Allgemeine Java-Themen 7
N LlaMA, KI, java-llama.cpp Allgemeine Java-Themen 39
V Java-Codierungsherausforderung: Navigieren durch die Macken der Datumsmanipulation Allgemeine Java-Themen 2
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
M java: unexpected type Allgemeine Java-Themen 2
harrytut Java Input/Output Tests Junit Allgemeine Java-Themen 3
B Java Discord bot auf ein Root Server? Allgemeine Java-Themen 1
BetziTheRealOne Java PKIX path building failed as non Admin Allgemeine Java-Themen 15
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
KonradN Java 21 Release Allgemeine Java-Themen 5
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
K Java Anwendung machen Anleitung Allgemeine Java-Themen 5
G java.io.listFiles() Allgemeine Java-Themen 3
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
K Java-Projekt Allgemeine Java-Themen 11
K Java-Projekt Allgemeine Java-Themen 0
ruutaiokwu Welcher Browser unterstützt heutzutage noch Java Applets? Allgemeine Java-Themen 5
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
rode45e Java Threads Allgemeine Java-Themen 4
G java.io.listFiles() Allgemeine Java-Themen 2
N Java Dynamic Proxy Allgemeine Java-Themen 3
N Leichte Java Gegner Ki Allgemeine Java-Themen 10
A Java modul Problem Allgemeine Java-Themen 4
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
V Funktionale Schnittstelle in Java Allgemeine Java-Themen 3
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
berserkerdq2 Wenn ich bei Intelij javafx mit maven importieren will, muss ich das in die pom.xml reintun, aber warum noch in module-info.java? Allgemeine Java-Themen 3
KonradN Java 20 am 21. März Allgemeine Java-Themen 1
O Java Website Stock Bot Allgemeine Java-Themen 3
J Front-/Backend in Java Allgemeine Java-Themen 14
doopexxx JAVA Google Webcrawler Allgemeine Java-Themen 1
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
G java.lang.NoClassDefFoundError: org/aspectj/lang/Signature Allgemeine Java-Themen 2
lalex1491 Java Aktienkurse nachfragen Allgemeine Java-Themen 4
J Class to link Java Allgemeine Java-Themen 4
V Wie funktioniert das Schlüsselwort "final" von Java? Allgemeine Java-Themen 19
mrStudent Inferenz JAVA Allgemeine Java-Themen 6
U URI Rechner (Java Script) Allgemeine Java-Themen 7
TheSkyRider Java Geburtsdatum Textfeld Allgemeine Java-Themen 7
mihe7 Java 19 JavaDocs: Browserintegration Allgemeine Java-Themen 0
Encera Gleichzeitiges Ausführen und verbinden von 2 Java-Klassen über die Eingabeaufforderung und Eclipse Allgemeine Java-Themen 21
H Java Rechner Programmierung der Mathematik Allgemeine Java-Themen 33
Lennox Schinkel Java Kara Auf einen Java Host laufen lassen Allgemeine Java-Themen 17
C Fußnoten von DocX mit Java Allgemeine Java-Themen 2
C Fußnoten in DocX mit Java Allgemeine Java-Themen 1
M Aussagenlogik in Java Programmieren Allgemeine Java-Themen 22
B Per Java Word Dokument schreiben? Allgemeine Java-Themen 8
krgewb Java-Bibliothek für ONVIF Allgemeine Java-Themen 1
KonradN Oracle übergibt (Java Teile der) GraalVM Community Edition an OpenJDK Community Allgemeine Java-Themen 2
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
B Java mit command line und jars benutzen? Allgemeine Java-Themen 18
M Java Überprüfen ob .exe-Datei bereits ausgeführt wird Allgemeine Java-Themen 2
B HTTP Allgemeine Fragen über Suchmaschine nutzen mit Java Allgemeine Java-Themen 20
Mick P. F. Wie kriege ich die Fehlermeldung "java: symbol lookup error: ..." weg? Allgemeine Java-Themen 11
K Nachhilfe Java Allgemeine Java-Themen 11
KonradN Java 19 Allgemeine Java-Themen 11
F IDEA IntelliJ Java Songliste erstellen Allgemeine Java-Themen 6
TheSepp Java bestimmtes Array auf den Wert 0 setzen Allgemeine Java-Themen 32
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
Sachinbhatt Sind alle Methoden in Java implizit virtuell Allgemeine Java-Themen 2
E Java und integrierte Grafikkarten Allgemeine Java-Themen 18
Sachinbhatt Wie wird die Typumwandlung bei Mehrfachvererbung in Java implementiert? Allgemeine Java-Themen 3
Peterw73 Hilfe bei Java gesucht Allgemeine Java-Themen 3
A Java unter Win 10 Allgemeine Java-Themen 1
B Woher kommen die Bildschirmkoordinaten beim java Robot? Allgemeine Java-Themen 14
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben