2009-04-23 12 views
0

Ich habe die Beschreibungen der Referenzierung in Java gelesen, und obwohl ich das Gefühl habe, dass ich sie verstehe, bin ich mir nicht sicher, ob Java mir Folgendes erlaubt: wir haben zwei Threads in der gleichen JVM, die über Sockets kommunizieren, und wir möchten im Wesentlichen die Adresse eines großen Datenblocks über den Socket weiterleiten, ohne die Daten selbst zu kopieren. Die Lösung mag für den Initiierten ziemlich offensichtlich sein, aber ich kann es nicht herausfinden! Hilfe wäre willkommen.Einen Verweis auf einen (großen) Datenbereich über einen Socket übergeben

+0

Sind die zwei Sockets in Komponenten, die voneinander partitioniert sind, wie separate Classloader? Ist das eine Optimierung für den speziellen Fall, in dem zwei Programme, die normalerweise auf verschiedenen Hosts laufen, im selben Prozess laufen? Ich frage mich nur, warum normale Parameterübergabe keine Option ist. – erickson

+0

Ein paar gute Vorschläge hier! Danke allen! –

Antwort

1

Was bewegt sich sonst noch an dieser Buchse? Wenn es Ihr eigenes Protokoll ist, fügen Sie ein Verb zu dem Protokoll hinzu, das sagt "Holen Sie das große Ding von einem bekannten Ort" und senden Sie einfach das Verb. Wie viele dieser Objekte gibt es? Können Sie eine Karte erstellen - String, Objekt - und übergeben Sie einfach die Zeichenfolge über den Sockel?

+0

Eigentlich mag ich das! Vielen Dank! Es erinnert mich an etwas, das ich vor einigen Jahren in einer anderen Umgebung gemacht habe - frage mich, warum ich nicht daran gedacht habe :-) –

0

Es kann möglich sein, JNI zu verwenden, aber ich denke nicht, dass es mit reinem Java möglich ist.

Vorausgesetzt, Sie sind innerhalb der gleichen JVM (und das ist die einzige Chance, die Sie haben, damit es funktioniert, es sei denn, Sie verwenden eine Memory-Mapped-Datei) müssen Sie wirklich Sockets verwenden? Kannst du nicht eine "direktere" API erstellen?

0

Es gibt zwei Möglichkeiten, dies zu tun.

  1. Setzen Sie die Referenz in einen globalen Speicherort, der später abgerufen werden kann. Senden Sie ein Objekt über den Socket, der beim Serialisieren in die global zugreifende Referenz aufgelöst wird. (Funktioniert nur in derselben JVM)
  2. Das große Objekt über RMI zugänglich machen. Senden Sie ein Objekt, das bei der Serialisierung einen RMI-Proxy für Ihr großes Objekt erstellt.

Verwenden einer direkten API, die effizienter und einfacher ist. Ich schlage vor, eine BlockingQueue in Betracht zu ziehen.

1

AFAIK Java bietet nicht die Möglichkeit, die Speicherreferenz eines Objekts zu erhalten. Was jedoch für Sie funktionieren könnte, ist die Verwendung eines Shared-Arrays oder eines Shared-Vektors, in dem Sie die Daten als Objekt in den Vektor/das Array einfügen und den Index des Objekts über den Socket übergeben.

0

Wenn Sie die Daten zwischen 2 Threads desselben Programms übergeben, können Sie einfach einen Verweis auf den Bereich über einen beliebigen Kanal aus dem Paket java.concurrent übergeben.

Wenn Sie zwei separate Programme ausführen, müssen Sie die Daten serialisieren (wenn Sie wirklich möchten, dass die Daten selbst übergeben werden).

Wenn Sie nur auf die Daten zugreifen möchten, können Sie einen Dienst veröffentlichen, der die gewünschte Transformation über RMI durchführt.

Verwandte Themen