Prozessübergreifende Synchronisation in Java

8

Wie kann ich zwei Java-Prozesse unter Windows synchronisieren?

Ich suche nach etwas wie dem Win32 Named Mutex-Objekt, das zwei Prozessen erlaubt, das gleiche Sperrobjekt zu verwenden.

Danke

    
Saar 14.03.2011, 11:15
quelle

7 Antworten

4

Es ist nicht möglich, in Java so etwas wie gewünscht zu machen. Verschiedene Java-Anwendungen verwenden unterschiedliche JVMs, die sich vollständig in verschiedene "Blackboxes" aufteilen. Sie haben jedoch 2 Optionen:

  1. Verwenden Sie Sockets (oder Kanäle). Im Grunde wird eine Anwendung den hörenden Sockel öffnen und warten, bis sie ein Signal empfängt. Die andere Anwendung verbindet sich dort und sendet Signale, wenn sie etwas abgeschlossen hat. Ich würde sagen, dass dies in 99,9% der Anwendungen bevorzugt wird.
  2. Sie können winapi von Java aus aufrufen. Ich erinnere mich nicht an die Besonderheiten, aber Sie können eine Fülle von Beispiel finden, wenn Sie google "Java Winapi".
bezmax 14.03.2011, 11:31
quelle
14

Java Cross Prozesssperre:

%Vor%     
Java42 06.03.2012 03:53
quelle
4

Ich vereinfachte Java42 Antwort

Verwendung

%Vor%

Der Code in successLockRunnable sperrt alle anderen Prozesse auf demselben Rechner mit dieser Implementierung.

Quelle

%Vor%     
Ilya_Gazman 13.06.2016 14:05
quelle
0

Ich bin mir nicht sicher, was Sie zu tun versuchen, indem ich etwas über JMX offenlege und die separaten Prozesse ein Status-Flag setzen, das dann Ihren Thread programmatisch aus einem Wartezustand heraus belebt. Anstelle von JMX könnten Sie natürlich einen Socket / RMI verwenden.

    
vickirk 14.03.2011 11:37
quelle
0

Ich glaube nicht, dass es dafür in der Java-Plattform native Methoden gibt. Es gibt jedoch mehrere Möglichkeiten, die gleiche Art von Effekt zu erzielen, je nachdem, welche Synchronisierung Sie durchführen möchten. Zusätzlich dazu, dass die Prozesse über Netzwerkverbindungen kommunizieren (direkte Sockets, Multicast mit einer Wahl usw.) oder auf plattformspezifische Aufrufe fallen, können Sie auch eine Dateisperre für eine freigegebene Datei ermitteln (siehe activemq passiver Stand-by mit a shared file system für ein Beispiel) oder eine Datenbank entweder mit einer Auswahl zum Aktualisieren oder einer optimistischen Aktualisierung einer Tabellenzeile verwenden.

    
philwb 16.03.2011 06:31
quelle
0

unter Verwendung von Sockets für Cross-Process-Synchronisationen ist gängige Praxis. Nicht nur für Java-Anwendungen, denn in den meisten * nix-Umgebungen haben wir keine systemweiten Mutexe wie in Windows.

    
andriy 18.03.2011 09:24
quelle
0

Wir verwenden diese Art von Anweisungen, um sicherzustellen, dass nur ein Prozess einen von "myLockKey" codierten Codeblock ausführen kann:

%Vor%

Hier verwenden wir diese Klasse:

%Vor%     
Benjamin Sonday 25.05.2017 00:35
quelle

Tags und Links