2010-03-27 10 views

Antwort

15

Der grundlegende Unterschied ist, dass Threads in denselben Adressräumen leben, aber Prozesse in den verschiedenen Adressräumen leben. Das bedeutet, dass es bei der Kommunikation zwischen Threads darum geht, Verweise auf Objekte zu übergeben und gemeinsame Objekte zu ändern. Bei Prozessen geht es jedoch darum, serialisierte Kopien von Objekten zu übergeben.

In der Praxis kann die Java-Inthread-Kommunikation als einfache Java-Methodenaufrufe auf gemeinsam genutztes Objekt mit entsprechender Synchronisation implementiert werden. Alternativ können Sie die neuen Parallelitätsklassen verwenden, um einige der wesentlichen (und fehleranfälligen) Synchronisation zu verbergen Probleme.

Im Gegensatz dazu basiert die Java-Interprozesskommunikation auf der untersten Ebene beim Umwandeln von Status, Anforderungen usw. in Bytefolgen, die als Nachrichten oder als Stream an einen anderen Java-Prozess gesendet werden können. Sie können diese Arbeit selbst erledigen, oder Sie können eine Vielzahl von "Middleware" -Technologien verschiedener Komplexitätsebenen verwenden, um die Implementierungsdetails zu abstrahieren. Zu den verwendbaren Technologien gehören Java-Objektserialisierung, XML, JSON, RMI, CORBA, SOAP/"Webdienste", Nachrichtenwarteschlangen und so weiter.

Auf einer praktischen Ebene ist Interthread-Kommunikation um viele Größenordnungen schneller als Interprozesskommunikation und ermöglicht es Ihnen, viele Dinge viel einfacher zu tun. Der Nachteil ist jedoch, dass alles in derselben JVM leben muss. Daher gibt es potenzielle Skalierbarkeitsprobleme, Sicherheitsprobleme, Robustheitsprobleme und so weiter.

+0

Dank Stephen, ich kann die Antwort theoritisch.Ist besser, wenn Sie einige Echtzeit Beispiele oder Code-Schnipsel geben, um diesen Unterschied zu erklären.Plz – JavaUser

+3

@JavaUser - meinst du Realtime oder Real Life? Wie auch immer, eine gute Möglichkeit, diese Dinge zu lernen, sind Sun/Oracles umfangreiche Online-Tutorial-Informationen. –

2

Ich denke gerne an eine einzelne Instanz einer JVM als Prozess. Die Interprozesskommunikation würde also zwischen Instanzen von JVMs erfolgen, beispielsweise über Sockets (Nachrichtenübergabe).

Threads in Java implementieren Runnable und sind in einer JVM enthalten. Sie teilen Daten einfach durch Weitergabe von Referenzen in der JVM herum. Wann immer Threads Daten gemeinsam nutzen, müssen Sie die Daten fast immer schützen, damit sich mehrere Threads nicht gegenseitig stören. Es gibt viele Schutzmechanismen, die verhindern, dass mehrere Threads in kritische Codeabschnitte gelangen.

5

Ein Thread kann auf Speicher innerhalb eines Prozesses zugreifen, sogar auf Speicher, der von einem anderen Thread innerhalb desselben Prozesses bearbeitet werden kann. Da alle Threads im selben laufenden Prozess intern sind, können sie schneller kommunizieren (weil sie nicht das Betriebssystem benötigen, um zu referieren).

Verfahren können in einem anderen Prozess nicht Speicher zugreifen, auch wenn Sie zwischen Prozessen durch verschiedene Mittel wie kommunizieren kann:

  1. Network-Pakete.
  2. Dateien
  3. Pipes
  4. Shared Memory
  5. Semaphore
  6. Corba Nachrichten
  7. RPC-Aufrufe

Die wichtige Sache mit Prozess zu erinnern, die Kommunikation zu verarbeiten ist, dass die Kommunikation verwaltet werden müssen durch das Betriebssystem, und wie alle Dinge, die einen mittleren Mann erfordern, fügt das Overhead hinzu.

Auf der Unterseite, wenn ein Thread falsch verhält, tut es dies innerhalb des laufenden Prozesses, und Chancen sind hoch, es wird in der Lage sein, alle gut benehmen Threads zu beseitigen. Wenn ein Prozess sich falsch verhält, kann er nicht direkt in den Speicher der anderen Prozesse schreiben, und die Chancen stehen gut, dass nur der Fehlverhaltensprozess stirbt.

2

Inter-Thread Kommunikation = Threads innerhalb derselben JVM zu jedem sprechen andere

Inter-Process Communication (IPC) = Fäden innerhalb der gleichen Maschine aber innen zueinander

Threads sprechen in verschiedenen JVMs laufenden Die gleiche JVM kann das Pipelining durch blockierungsfreie Warteschlangen verwenden, um mit einer Latenz von einer Nanosekunde miteinander zu kommunizieren.

Threads in verschiedenen JVMs können Off-Heap Shared Memory verwenden (normalerweise über die gleiche Speicherabbilddatei abgerufen), um miteinander über eine Latenz von Nanosekunden zu kommunizieren.

Threads in verschiedenen Maschinen können das Netzwerk verwenden, um mit einer Latenz von Mikrosekunden miteinander zu kommunizieren.

Für eine vollständige Erklärung über die blockierungsfreien Warteschlangen und IPC können Sie CoralQueue überprüfen.

Haftungsausschluss: Ich bin einer der Entwickler von CoralQueue.