T
tuxedo
Gast
Hallo,
ich hab gerade ein kleines Synchronisationsproblem:
Ich hab eine Klasse die asynchron sendet und empfängt. In der Methode in der gesendet wird, sieht's zur Zeit so aus:
So. In Zeile 2 wird das Paket zum Senden abgegeben. Der Server empfängt dieses, macht was damit und gibt eine Antwort zurück. Die Antwort wird vom Client der die Anfrage gestellt hat in einem separaten Thread empfangen und in "requestResults" deponiert. Sofort danach wird der wartende "monitor" geweckt.
Ich hab jetzt das Problem, dass in einer lokalen Umgebung, das Antwortpaket zwischen dem ersten synchronized-Block in Zeile 5 und dem zweiten synchronized block in Zeile 11 eintrifft. Folglich wartet sich der Monitor zu tode --> doofe Sache.
Ich hatte auch schon folgende Variante probiert, welche aber zu viel Zeit gekostet hat:
Ich hab ein Monitorobjekt mit einem "Sleep-Flag". Dieses wird gesetzt wenn der Monitor schlafen gelegt wird (also direkt bevor wait() aufgerufen wird).
Aufwecken des Monitors geht dann über "notify()". Aber zuvor wird geschaut ob der Monitor überhaupt schon schläft. Schläft er nicht, wird wenige Millisekunden geschlafen und dann nochmal geschaut ob er nun schläft und aufgeweckt werden kann.
Klar. Funktionieren tut das. Ist aber irgendwie eine Holzhammermethode wenns einem um jede Millisekunde geht. Das Problem betrifft meine SIMON Bibliothek (siege Signatur). Da bin ich um jede zehntel Millisekunde die ein Remote-Methodenaufruf weniger dauert froh.
Nun. Jetzt ist halt die Frage wie ich möglichst ohne eine feste Zeit im Programm zu warten, die Lücke zwischen den beiden synchronized-Blöcken schließen kann.
Any ideas?
- Alex
ich hab gerade ein kleines Synchronisationsproblem:
Ich hab eine Klasse die asynchron sendet und empfängt. In der Methode in der gesendet wird, sieht's zur Zeit so aus:
Code:
send(key, packet.getByteBuffer());
// check if need to wait for the result
synchronized (requestResults) {
if (requestResults.containsKey(requestID))
return requestResults.remove(requestID);
}
// got to sleep until result is present
synchronized (monitor) {
try {
monitor.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// result is definitely here, return it
synchronized (requestResults) {
return requestResults.remove(requestID);
}
So. In Zeile 2 wird das Paket zum Senden abgegeben. Der Server empfängt dieses, macht was damit und gibt eine Antwort zurück. Die Antwort wird vom Client der die Anfrage gestellt hat in einem separaten Thread empfangen und in "requestResults" deponiert. Sofort danach wird der wartende "monitor" geweckt.
Ich hab jetzt das Problem, dass in einer lokalen Umgebung, das Antwortpaket zwischen dem ersten synchronized-Block in Zeile 5 und dem zweiten synchronized block in Zeile 11 eintrifft. Folglich wartet sich der Monitor zu tode --> doofe Sache.
Ich hatte auch schon folgende Variante probiert, welche aber zu viel Zeit gekostet hat:
Ich hab ein Monitorobjekt mit einem "Sleep-Flag". Dieses wird gesetzt wenn der Monitor schlafen gelegt wird (also direkt bevor wait() aufgerufen wird).
Aufwecken des Monitors geht dann über "notify()". Aber zuvor wird geschaut ob der Monitor überhaupt schon schläft. Schläft er nicht, wird wenige Millisekunden geschlafen und dann nochmal geschaut ob er nun schläft und aufgeweckt werden kann.
Klar. Funktionieren tut das. Ist aber irgendwie eine Holzhammermethode wenns einem um jede Millisekunde geht. Das Problem betrifft meine SIMON Bibliothek (siege Signatur). Da bin ich um jede zehntel Millisekunde die ein Remote-Methodenaufruf weniger dauert froh.
Nun. Jetzt ist halt die Frage wie ich möglichst ohne eine feste Zeit im Programm zu warten, die Lücke zwischen den beiden synchronized-Blöcken schließen kann.
Any ideas?
- Alex