Thread => Resource

mariusmeier

Mitglied
Hallo zusammen

Ich habe folgendes Szenario: Ein Thread bearbeitet eine Queue, welche Nachrichten für einen Server beinhaltet. In der Queue hole ich mir jeweils eine Nachricht und versende diese an den Server. Danach muss ich warten, bis eine Antwort zurück kommt. (Serielle Datenkommunikation) Falls keine Antwort zurück kommt, startet innerhalb von 10 Sekunden ein TimerTask(), welcher die Queue von den Verbindungen löst, welche nicht gesendet werden konnte.
Leider jedoch während diesen 10 Sekunden ist die CPU Usage 100%, da einfach der Thread in der while() Schlaufe wartet bis entweder eine Nachricht zurück kommt oder der TimerTask gestartet wird. Wie kann man nun die Usage so gestalten, dass da die CPU nicht 100% ausgelastet wird. Muss ich meine Queue anderst programmiere ?

Java:
while(!getMessageQueue().isEmpty()) {
				System.err.println("Queue handling!");
				/*---------------------Get message from queue----------------------------*/
				if(getNextMessage) {
					try {
						currentMessage = (Vector) getMessageQueue().poll();
					} catch(NoSuchElementException e) {
						System.err.println("Empty queue!");
					}
					
					if(currentMessage != null) {
						deviceAddress = (String)currentMessage.get(0);
						deviceType = (String)currentMessage.get(1);
						sendBuffer = (byte[])currentMessage.get(2);
						getNextMessage = false;
						sendMessage = true;
						
						if(releaseTimer == null) {
							releaseTimer = new Timer();
							releaseTimer.schedule(new ReleaseQueueTask(deviceAddress, deviceType), releaseTime);
						}	
					} else {
						//Queue is empty!
						getNextMessage = false;
						sendMessage = false;
					}
				}
				/*-----------------End get message from queue----------------------------*/
				
				/*-------------------------Send message----------------------------------*/
				else if(sendMessage) {
					sendMessage = false;
					boolean isWritingToDevice = false;
					IDriver device = searchIDriver(deviceAddress);
					if(device != null) {
						try {
							System.err.println("Write with registered driver: " + device.getDeviceAdress());
							device.write(sendBuffer, sendBuffer.length);
							isWritingToDevice = true;
						} catch (IOException e) {
							System.err.println("Failure by sending Message! (Existing driver)");
						}
					} else {
						//If driver does not exists, we have to create a temporarily driver to communicate with frontend.
						//This could happen, if the frontend has no active measure channel.
						registerDevice(deviceAddress, deviceType);
						device = searchIDriver(deviceAddress);
						if(device != null) {
							try {
								device.write(sendBuffer, sendBuffer.length);
							} catch (IOException e) {
								System.err.println("Failure by sending Message! (New driver)");
							}
						}
					}	
				} else {
					try {
						Thread.sleep(2000);
					} catch (InterruptedException e) {
						System.out.println("Thread sleep error: " + e.getMessage());
					}
				}
				/*---------------------End send message----------------------------------*/
			}

Irgendwie sollte doch möglich sein, den Thread in einen idle state zu senden. Die methoden von ServerSocket haben ja auch eine accept Methode... wenn ich dort in einer while-Schlaufe diese accept Methode betreibe, wird auch nicht 100% CPU ausgelastet. Was kann man tun ?

MFG
 

Michael...

Top Contributor
Hier mal wie ich das verstanden habe:
Wenn eine Nachricht erfolgreich versendet wurde oder nach 10 sec keine Antwort zurückgekommen ist, wird sie aus der Queue gelöscht. Es wird eine Nachricht nach der anderen gesendet - also kann es vorkommen, dass der Client 10 sec warten muss, bis die nächste Nachricht versendet werden kann.

Dann könnte man nach dem Versenden einfach einen Thread oder Timer starten, der erst einmal 10 sec schlafen gelegt wird. Kommt innerhalb der 10 sec eine Antwort wird die Nachricht aus der Queue gelöscht. Nach 10 sec erwacht der Thread/Timer und prüft ob die Nachricht noch in der Queue ist, wenn ja, dann löscht er die Nachricht und meldet dem Sendethread, dass die nächste Nachricht gesendet werden kann.
 

Marco13

Top Contributor
Der Code ist erstmal nicht so leicht nachvollziehbar. Aber wenn da irgendein Thread auf sowas wie einem Socket ein "read" ausführt, dann (kann man dem AFAIK auch ein Timeout übergeben? und dann) blockiert er doch automatisch!?
 

mariusmeier

Mitglied
Hallo

Ja Michael, so wäre es gedacht. Es kann vorkommen das die Queue für 10 Sekunden gesperrt ist für andere Geräte. Das ist bis jetzt soweit in Ordnung.
Dein Vorschlag mit dem Timer muss ich mir genauers Überlegen. Momentan ist es ja so, dass jeweils mit put das Element aus der Queue gerade gelöscht wird. Ich hole mir also immer ein Element aus der Queue und lösche es aber gerade. Da die Steuerbefehle auf das Gerät via TCP realisiert sind, kann ich davon ausgehen, dass wenn innerhalb dieser 10 Sekunden keine Nachricht zurück kommt, irgendwas schief gelaufen ist.
Marco: Das read geschieht ja in einem anderen Teil (In einem Treiber) der unabhängig von dieser Queue arbeitet. Man könnte vielleicht auf dieser Ebene der Queue signalisieren, dass sie nicht länger warten muss, da Kommunikationsprobleme aufgetreten sind.
Trotzdem will ich nochmals nachfragen, ob man die while-Schlaufe in einem Thread so realisieren kann, dass diese nicht die 100% CPU Usage verursacht?

MFG
 

mariusmeier

Mitglied
Hallo zusammen

Ich habe mein Problem mit der wait-notify Variante gelöst. Falls eine Nachricht versendet wird, wird der Thread mit wait() angehalten bis eine Nachricht vom Server zurück kommt oder der TimerTask ein Verbindungsproblem meldet. Bei beiden Möglichkeiten rufe ich dann wieder notify() auf.

MFG
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Vorschläge für Umstellung auf Thread-Nutzung erwünscht Java Basics - Anfänger-Themen 7
Z Sikuli Thread Fehler Java Basics - Anfänger-Themen 3
Leyla Thread isInterrupt Java Basics - Anfänger-Themen 18
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread Producer - Consumer Java Basics - Anfänger-Themen 1
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
A Thread find number Java Basics - Anfänger-Themen 8
F Thread.sleep() Java Basics - Anfänger-Themen 5
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 8
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
M Thread-Zustände Java Basics - Anfänger-Themen 6
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
C Thread und TimerTask, Verstädnisproblem Java Basics - Anfänger-Themen 10
amgadalghabra Sorting Thread Launcher Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
A Thread Java Basics - Anfänger-Themen 4
A Thread Java Basics - Anfänger-Themen 1
A Thread Java Basics - Anfänger-Themen 0
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
B Thread / Prozess stoppen? Java Basics - Anfänger-Themen 22
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 0
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
J Thread Handling Java Basics - Anfänger-Themen 9
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
C Thread in Methode + raus aus der Schleife Java Basics - Anfänger-Themen 10
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
B Thread Problem Java Basics - Anfänger-Themen 7
N KeyListener in Thread Java Basics - Anfänger-Themen 0
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
D Ausgeben welcher Thread gerade Arbeitet Java Basics - Anfänger-Themen 8
N Threads Thread-Fehler Java Basics - Anfänger-Themen 2
F Thread um Uhrzeit ausführen Java Basics - Anfänger-Themen 5
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
J Exception in thread "main" Java Basics - Anfänger-Themen 1
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
B Animation mit Thread(s) Java Basics - Anfänger-Themen 23
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
M Threads Jede Klasse einem Thread zuweisen Java Basics - Anfänger-Themen 7
J Java Thread cancel() und wiederbeleben Java Basics - Anfänger-Themen 4
J BouncingBalls 1 Thread Java Basics - Anfänger-Themen 3
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
fLooojava Laufender Thread | Boolean ändern Java Basics - Anfänger-Themen 9
T Thread Pool mit Work Stealing Java Basics - Anfänger-Themen 1
R Java Thread Java Basics - Anfänger-Themen 10
J Welche Methoden laufen im neuen thread ?? Java Basics - Anfänger-Themen 9
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5
K Thread - Methoden in die run Methode Schreiben Java Basics - Anfänger-Themen 5
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
V Threads Exception in Thread behandeln Java Basics - Anfänger-Themen 3
S Methoden Multi-Thread und Methoden Objects. Java Basics - Anfänger-Themen 1
J Thread erstellen (BlueJ Projekt) Java Basics - Anfänger-Themen 3
P Exception in thread "main" java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 1
F Threads Variable aus einem Thread in main Methode? Java Basics - Anfänger-Themen 9
K Exception in thread "main" Java Basics - Anfänger-Themen 7
L Thread-Frage Java Basics - Anfänger-Themen 2
E Was ist ein idle-thread? Java Basics - Anfänger-Themen 1
D Exception in thread "AWT-EventQueue-0" Java Basics - Anfänger-Themen 8
J Threads Prozess in Thread auslagern Java Basics - Anfänger-Themen 2
G Thread mehrmals starten und schliessen Java Basics - Anfänger-Themen 6
F Thread Koordination (Vorteile/Nachteile) Java Basics - Anfänger-Themen 0
O Thread aus dem Thread stoppen Java Basics - Anfänger-Themen 6
O Swingworker/Thread Java Basics - Anfänger-Themen 3
R Focus auf JPanel im Thread Java Basics - Anfänger-Themen 9
S musik in eigenem thread Java Basics - Anfänger-Themen 2
A Klasse,Vererbung,Interface,Singleton,Thread Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben