Hi,
wie ihr sicherlich seht ist das mein erster Post in diesem Forum. Ersteinmal möchte ich herzlichst danken. Ihr habt mir bei meinen Google-Suchen schon diverse Male weitergeholfen.
Nun habe ich jedoch ein Problem, dass ich auch hier noch nicht beschrieben gefunden habe:
Ich habe eine Server-Client Software implementiert, die grundsätzlich auch super funktioniert. Ich schicke über den OutputStream (ObjectOutput) eines SSLSockets und empfange in einem eigenen Thread auf dessen InputStream.
Nun habe ich jedoch, in bestimmten Fällen, den Wunsch, ein Objekt des Clients auf dem Stream zu verschicken und die Antwort des Servers direkt wieder zurückzugeben. Dafür will ich den lesenden Thread pausieren (wait()) und anschließend wieder aufwecken, damit dieser nicht das Objekt abfängt.
Mein Code dazu sieht bisher so aus:
...beim Verbinden...
Senden auf dem OutputStream
Lesen des InputStreams
Leider erhalte ich immer eine IllegalMonitorStateException:
Ich habe auch schon jede "Verschachtelung" von synchronisierung versucht. Einziges anderes Ergebnis war, dass der Client sich komplett aufgehangen hat (wahrscheinlich weil irgendwo in der synchronisierung ein after-you after-you auftrat).
Ich fühl mich leider noch nicht so sicher mit dem Synchronisieren von Methoden/Blöcken/etc.
Könnt ihr mir da vielleicht ein paar Hinweise geben, wie ich dieses Problem lösen könnte?
Gruß razr
wie ihr sicherlich seht ist das mein erster Post in diesem Forum. Ersteinmal möchte ich herzlichst danken. Ihr habt mir bei meinen Google-Suchen schon diverse Male weitergeholfen.
Nun habe ich jedoch ein Problem, dass ich auch hier noch nicht beschrieben gefunden habe:
Ich habe eine Server-Client Software implementiert, die grundsätzlich auch super funktioniert. Ich schicke über den OutputStream (ObjectOutput) eines SSLSockets und empfange in einem eigenen Thread auf dessen InputStream.
Nun habe ich jedoch, in bestimmten Fällen, den Wunsch, ein Objekt des Clients auf dem Stream zu verschicken und die Antwort des Servers direkt wieder zurückzugeben. Dafür will ich den lesenden Thread pausieren (wait()) und anschließend wieder aufwecken, damit dieser nicht das Objekt abfängt.
Mein Code dazu sieht bisher so aus:
...beim Verbinden...
Java:
listener = new Thread(
new Runnable() {
public void run() {
listen();
}
}
);
/* Starten des 'lauschenden' Threads */
listener.start();
Senden auf dem OutputStream
Java:
public EventmanagerData send(EventmanagerData data) {
try {
/* Schlafen legen des 'lauschenden' Threads */
listener.wait();
/* Schreiben der Daten in den Stream */
objOut.writeObject(data);
objOut.flush();
EventmanagerData ret = (EventmanagerData) objIn.readObject();
/* Aufwecken des 'lauschenden' Threads */
listener.notify();
/* Rückgabe des Objekts des Servers */
return ret;
} /* ... catchen und verarbeiten der Exceptions */
return null;
}
Lesen des InputStreams
Java:
private void listen() {
while(run) {
try {
Object obj = objIn.readObject();
/* das Object weiter verarbeiten */
} /* ... catchen und verarbeiten der Exceptions */
}
}
Leider erhalte ich immer eine IllegalMonitorStateException:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalMonitorStateException
Ich habe auch schon jede "Verschachtelung" von synchronisierung versucht. Einziges anderes Ergebnis war, dass der Client sich komplett aufgehangen hat (wahrscheinlich weil irgendwo in der synchronisierung ein after-you after-you auftrat).
Ich fühl mich leider noch nicht so sicher mit dem Synchronisieren von Methoden/Blöcken/etc.
Könnt ihr mir da vielleicht ein paar Hinweise geben, wie ich dieses Problem lösen könnte?
Gruß razr