# EIN Thread in RMI auf Serverseite



## frage (2. Sep 2008)

Guten Morgen!

ich arbeite zur Zeit mit RMI, und muss sagen, dass ich es wohl nicht so ganz verstanden habe. 

In meiner Applikation habe ich mit RMI eine Kommunikation zw. 2 Java-Programmen hergestellt. 

Die Applikation, die als RMI-Server fungiert, startet die 2. Applikation, die als Client dient. Der Client nimmt Berechnungen vor, und schickt die Ergebnisse an den Server über RMI.
Nun muss es so sein, dass in der Server - Applikation wieder der Thread verwendet werden muss, der vorher die Client-Applikation gestartet hat. Beobachte ich aber die Threads in meiner aktuellen Lösung, dann wird nach Empfang der Daten im Server ein anderer Thread verwendet, als der, der die Client-Applikation gestartet hat.

Ist das eine Eigenschaft von RMI, oder habe ich falsch programmiert?
Wie schaffe ich es, dass der Server nach Empfang der Daten vom Client den selben Thread benutzt, wie der, der zum Starten des Clients verwendet wurde?

Vielen Dank für jegliche Rückmeldungen!!
frage


----------



## SlaterB (2. Sep 2008)

ob irgendwelche Einstellen helfen weiß ich nicht,
günstig wäre vielleicht ein synchroner Aufruf:
der Starter ruft beim Client was auf und der RÜCKGABEWERT sind die benötigten Daten,
die kommen garantiert beim gleichen Thread an, eben genau beim Aufrufer, wie so in Java üblich,
der Aufrufer wäre dann aber für die Dauer der Berechnung blockiert

--------


mit Threads kann man hantieren wie mit anderen Objekten auch,

der Client-Starter-Thread kann sich nach dem Starten schlafen legen, wahrscheinlich mit wait(),
der Empfangs-Thread muss nun nur die Daten irgendwo ablegen und den Starter-Thread mit notify aufwecken,

damit sich alle kennen und gemeinsame Ablageflächen für Daten haben braucht es irgendeine Vermittlerstelle,
ein statisches Objekt/ Singleton, so dass z.B. jede Programmstelle

StarterThread sr = Registry.INSTANCE.getStarterThread();
synchronized(sr) {
sr.putData(neue Daten);
sr.notify();
}

aufrufen kann,

deiner Frage nach zu urteilen solltest du aber zunächst ein Lehrbuch zu Threads aufschlagen 
und die Kommunikation + den Datenaustausch von Threads in kleinen Beispielen lernen
(Consumer + Producer-Beispiel)


----------



## frage (2. Sep 2008)

Hallo SlaterB,

vielen Dank für Deine Antwort!

Ich starte die Client-Applikation über eine Batch-Datei aus dem Kode heraus. Deshalb kommt direkt dort kein Rückgabewert an, und deshalb ist es wohl auch nicht der gleiche Thread, oder?
Der Client greift logischerweise auf die Methode am Server zu, die im Remote-Interface definiert ist.

Ja, den Verdacht hatte ich auch schon, dass ich mir mal ein Kapitel über Threads ansehen sollte ... 

Viele Grüße,
frage


----------



## tuxedo (2. Sep 2008)

>> Beobachte ich aber die Threads in meiner aktuellen Lösung, dann wird nach Empfang der Daten im Server ein anderer Thread verwendet, als der, der die Client-Applikation gestartet hat. 

AFAIK läuft doch der Server in RMI in einem eigenen Thread. Wäre ja auch "uncool" wenn der Serverthread der Main-Thread wäre und somit alles was im Main-Thread läuft blockieren könnte.

Verwendest du zufällig SWT oder warum muss das alles wieder in den Erzeuger-Thread hinein?

- Alex


----------

