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 ?
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
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