2008-11-13 12 views
50

Ist es möglich, ein "C like" fork in Java zu verwenden, mit einem neuen unabhängigen jvm-Prozess?Java - C-Like Gabel?

Wie?

+1

Vielleicht könnten Sie genauer auf das eingehen, was Sie erreichen möchten? Wie bereits erwähnt, können Sie exec() einen anderen Prozess ausführen, der eine andere Instanz der JVM sein könnte, aber das gibt Ihnen nicht den gleichen Status wie fork() in C. Auf der anderen Seite können Sie Threads ausführen, aber dort bekommst du mehr teilen als du mit fork(). –

+0

Ich möchte einfach die Freigabe vermeiden, die dieser Thread impliziert. Thks für Ihr Anliegen :) – sakana

Antwort

10

Lustigerweise arbeite ich gerade daran: ein Java-Prozess, der andere Java-Prozesse ausführt. Ich benutzte den Artikel From Runtime.exec() to ProcessBuilder als solide Basis und When Runtime.exec() won't als einen guten Rat, wie man die Ausgangsströme verschlingt.

PS .: Für diejenigen, die sich wundern, musste ich das tun (anstatt neue Threads zu erzeugen), weil ein anderer Java-Prozess das Vorhandensein dieser Prozesse überprüft, die normalerweise separat mit Shell-Befehlen ausgeführt werden.

+2

Die beziehen sich nur auf 'Runtime.exec()', was anders ist, als in der Lage sein, das Kind nach einer 'fork()' explizit zu steuern. – ShiDoiSi

+0

Können Sie bitte die Antwort aktualisieren und den Link für ProcessBuilder reparieren? –

12

Diese Antwort ist wahrscheinlich ein wenig spät, aber:

http://akuma.kohsuke.org/

scheint genau das zu sein, was Sie suchen

+0

Es scheint, dass es nicht wirklich verzweigt, sondern die neuen Child-Prozesse von exec in einer Weise, die einige Vorteile wie fork bietet. – rogerdpack

+3

Beachten Sie, dass es nur auf einem POSIX-ähnlichen System funktioniert (also ungefähr alles außer Windows) – CharlesB

+0

Sie können den Quellcode von Akuma lesen und die POSIX-API verwenden, die JNA wie akuma verwendet. – Arnaud

3

Die Application Isolation API (JSR 121) stellt Isolate, die diesen Anwendungsfall anspricht.

+1

Soweit ich sehen kann, wird die Isolation API unter dem aktuellen (1.8) JDK nicht unterstützt. Es gibt ein experimentelles MVM-Projekt (Multitasking Virtual Machine), das funktioniert, aber es hat seinen Weg nicht in der Mainline gefunden. Außerdem scheint mir, dass die Isolation-API es nicht erlaubt, eine Verzweigung auszuführen, in der der Status des Forking-Prozesses in das Kind geklont wird: Soweit ich das verstehen konnte, beginnt das Isolat mit einer Hauptmethode und (natürlich) verschiedene Isolate teilen keinen Zustand. –