1. Schaffung des Java -Prozesses
Java bietet zwei Methoden, um einen Prozess oder ein anderes Programm zu starten:
(1) verwenden
1.1 ProcessBuilder
Die ProcessBuilder -Klasse ist eine neue Klasse, die in Java.Lang von J2SE 1.5 hinzugefügt wurde. Vor J2SE 1.5 wurde die Prozesskontrolle und -verwaltung von der Prozessklasse implementiert.
Jede ProcessBuilder -Instanz verwaltet eine Reihe von Prozesseigenschaften. Die Start () -Methode verwendet diese Eigenschaften, um eine neue Prozessinstanz zu erstellen. Die Start () -Methode kann wiederholt aus derselben Instanz aufgerufen werden, um einen neuen untergeordneten Prozess mit denselben oder verwandten Eigenschaften zu erstellen.
Jeder Prozessgenerator verwaltet diese Prozesseigenschaften:
Ein Befehl ist eine Liste von Zeichenfolgen, die die externe Programmdatei darstellen, die aufgerufen werden soll, und deren Parameter (falls vorhanden). Hier ist die Liste der Zeichenfolgen, die gültige Betriebssystembefehle darstellen, systemabhängig. Beispielsweise wird jede Gesamtvariable normalerweise zu einem Element in dieser Liste, aber es gibt Betriebssysteme, die das Programm selbst markieren möchten, dass die Befehlszeilen -Zeichenfolgen selbst markieren - In solchen Systemen müssen Java -Implementierungen möglicherweise Befehle genau diese beiden Elemente einbeziehen.
Umgebungen sind systemabhängige Mappings von Variablen bis Werten. Der Anfangswert ist eine Kopie der aktuellen Prozessumgebung (siehe System.getenv ()).
Arbeitsverzeichnis. Der Standardwert ist das aktuelle Arbeitsverzeichnis des aktuellen Prozesses, der normalerweise gemäß der Systemeigenschaft Benutzer genannt wird.
RecirecterrorStream -Eigenschaft. Zunächst ist diese Eigenschaft falsch, was bedeutet, dass die Standardausgabe und die Fehlerausgabe des untergeordneten Prozesses an zwei unabhängige Streams gesendet werden, auf die über den Prozess zugegriffen werden kann. Wenn der Wert auf TRUE eingestellt ist, wird der Standardfehler mit der Standardausgabe zusammengeführt. Dies erleichtert das Zusammenstellen von Fehlermeldungen und die entsprechende Ausgabe. In diesem Fall können die fusionierten Daten aus dem von Process.GetInputStream () zurückgegebenen Stream gelesen werden, während der Stream aus Process.getErstream () das Ende der Datei direkt erreicht.
Durch die Änderung der Eigenschaften des Prozessbauers wirken sich die nachfolgenden Prozesse aus, die mit der Start () -Methode des Objekts gestartet wurden, aber niemals zuvor begonnene Prozesse oder Java selbst beeinflussen. Die meisten Fehlerprüfungen werden von der Start () -Methode durchgeführt. Der Zustand des Objekts kann geändert werden, aber start () wird auf diese Weise fehlschlagen. Wenn Sie beispielsweise die Befehlseigenschaft auf eine leere Liste festlegen, wird eine Ausnahme nicht ausgeliefert, es sei denn, Start () ist enthalten.
Beachten Sie, dass diese Klasse nicht synchron ist. Wenn mehrere Threads gleichzeitig auf einen ProcessBuilder zugreifen und mindestens einen der Threads strukturell eines der Eigenschaften ändern, muss es die externe Synchronisation aufbewahren.
Zusammenfassung der Konstruktionsmethoden
ProcessBuilder (Befehl listen <string>)
Konstruieren Sie einen Prozessgenerator unter Verwendung bestimmter Betriebssystemprogramme und -Parameter.
ProcessBuilder (String ... Befehl)
Konstruieren Sie einen Prozessgenerator unter Verwendung bestimmter Betriebssystemprogramme und -Parameter.
Methodenzusammenfassung
Liste <String> Befehl () ()
Gibt die Betriebssystemprogramme und Parameter dieses Prozessgenerators zurück.
ProcessBuilder -Befehl (Befehl listen <string>)
Legt die Betriebssystemprogramme und Parameter dieses Prozessgenerators fest.
ProcessBuilder -Befehl (String ... Befehl)
Legt die Betriebssystemprogramme und Parameter dieses Prozessgenerators fest.
Dateiverzeichnis ()
Gibt das Arbeitsverzeichnis dieses Prozessgenerators zurück.
ProcessBuilder -Verzeichnis (Dateiverzeichnis)
Legt das Arbeitsverzeichnis für diesen Prozessgenerator fest.
Karte <String, String> Umgebung ()
Gibt eine String -Mapping -Ansicht dieser Prozessgeneratorumgebung zurück.
boolescher RedirecterrorStream ()
Benachrichtigen Sie den Prozessgenerator, ob Standardfehler und Standardausgabe zusammengeführt werden sollen.
ProcessBuilder RedirecterrorStream (boolean recirecterrorstream)
Legt die recirecterrorStream -Eigenschaft dieses Prozessgenerators fest.
Prozess starten ()
Starten Sie einen neuen Prozess mit den Eigenschaften dieses Prozessgenerators.
1.2 Laufzeit
Jede Java -Anwendung verfügt über eine Laufzeitklasseninstanz, mit der die Anwendung eine Verbindung zu der von ihr ausgeführten Umgebung herstellen kann. Die aktuelle Laufzeit kann durch die GetRuntime -Methode erhalten werden.
Anwendungen können keine eigenen Laufzeitklasseninstanzen erstellen. Sie können jedoch die GetRuntime -Methode verwenden, um den Verweis auf das aktuelle Laufzeit -Laufzeitobjekt zu erhalten. Sobald Sie einen Verweis auf das aktuelle Laufzeitobjekt erhalten haben, können Sie die Laufzeitobjektmethode aufrufen, um den Status und das Verhalten der virtuellen Java -Maschine zu steuern.
Java -Code -Sammlung Code
void addShutdownhook (Thread Hook)
Registrieren Sie eine neue virtuelle Maschine, um den Haken auszuschalten.
int verfügbare Processors ()
Gibt die Anzahl der verfügbaren Prozessoren an die Java Virtual Machine zurück.
Process exec (String -Befehl)
Führen Sie den angegebenen String -Befehl in einem separaten Vorgang aus.
Process exec (String [] cmDarray)
Führen Sie angegebene Befehle und Variablen in einem separaten Prozess aus.
Process exec (string [] cmDarray, String [] envp)
Führen Sie angegebene Befehle und Variablen in einem separaten Prozess der angegebenen Umgebung aus.
Process exec (string [] cmDarray, String [] envp, Datei dir)
Führen Sie angegebene Befehle und Variablen in separaten Prozessen in der angegebenen Umgebung und im Arbeitsverzeichnis aus.
Process exec (String -Befehl, String [] envp)
Führen Sie den angegebenen String -Befehl in einem separaten Prozess der angegebenen Umgebung aus.
Process Exec (String -Befehl, String [] envp, Datei -DIR)
Führen Sie den angegebenen String -Befehl in einem separaten Prozess mit einer angegebenen Umgebung und einem Arbeitsverzeichnis aus.
Hohlraum -Ausstieg (int Status)
Beenden Sie die derzeit ausgeführte Java -Virtual -Maschine, indem Sie die Abschaltsequenz der virtuellen Maschine starten.
Langer Freememory ()
Gibt die Menge an freiem Speicher in der virtuellen Java -Maschine zurück.
void GC ()
Führen Sie den Müllsammler.
InputStream getLocalizedInputStream (InputStream in)
Veraltet. Beginnend mit JDK 1.1 besteht die bevorzugte Methode zum Konvertieren eines lokal codierten Byte -Streams in einen Unicode -Zeichenstrom darin, die Klassen für InputStreamReader und BufferedReader zu verwenden.
OutputStream getLocalizedOutputStream (OutputStream Out)
Veraltet. Beginnend mit JDK 1.1 besteht die bevorzugte Methode zum Konvertieren eines Unicode -Zeichenstroms in einen lokal codierten Byte -Stream darin, den OutputStreamWriter-, BufferedWriter- und Printwriter -Klassen zu verwenden.
Statische Laufzeit getruntime ()
Gibt das Laufzeitobjekt zurück, das der aktuellen Java -Anwendung zugeordnet ist.
void Halt (int Status)
Erzwungen beenden die derzeit laufende Java -Virtual Machine.
Hohlraumlast (String -Dateiname)
Laden Sie den angegebenen Dateinamen als dynamische Bibliothek.
Hohlraumlastlibrary (String libname)
Lädt eine dynamische Bibliothek mit dem angegebenen Bibliotheksnamen.
langer MaxMemory ()
Gibt die maximale Speichermenge zurück, die die virtuelle Java -Maschine verwendet.
boolean removeshutdownhook (Thread Hook)
Einen zuvor registrierten virtuellen Computer nicht registrieren, um den Haken auszuschalten.
void runfinalisierung ()
Führt die Kündigungsmethode aller Objekte aus, die die Abschlüsse aussetzen.
statische Leere RunfinalizerSonexit (boolescher Wert)
Veraltet. Diese Methode selbst ist unsicher. Es kann eine endgültige Methode für das verwendete Objekt aufrufen, während andere Threads auf diesen Objekten arbeiten, was zu falschem Verhalten oder Deadlocks führt.
Langes Totalmory ()
Gibt die Gesamtmenge des Speichers in der virtuellen Java -Maschine zurück.
Void TraceInstructions (boolean on)
Befehlsverfolgung aktivieren/deaktivieren.
Hohlraumtracemethodcalls (boolean on)
Aktivieren/Deaktivieren Sie die Verfolgung der Methode aufrufen.
1.3 Prozess
Unabhängig davon, welche Methode zum Start des Prozesses verwendet wird, wird eine Instanz der Prozessklasse repräsentiert, dass der gestartete Prozess zurückgegeben wird, mit dem der Prozess gesteuert und relevante Informationen erhalten werden kann. Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法:
void zerstören ()
Töte den Kinderprozess.
一般情况下,该方法并不能杀掉已经启动的进程,不用为好。
int exitValue()
Gibt den Ausgangswert des Kinderprozesses zurück.
只有启动的进程执行完成、或者由于异常退出后,exitValue()方法才会有正常的返回值,否则抛出异常。
InputStream getRrorStream ()
Ruft den Fehlerstrom des untergeordneten Prozesss ab.
Wenn die Fehlerausgabe umgeleitet wird, kann die Fehlerausgabe nicht aus dem Stream gelesen werden.
InputStream getInputStream ()
Ruft den Eingangsstrom des Kinderprozesses ab.
Die Standardausgabe des Prozesses kann aus diesem Stream gelesen werden.
OutputStream -GetOutputStream ()
Ruft den Ausgangsstrom des Kinderprozesses ab.
Die in den Stream geschriebenen Daten werden als Standardeingabe für den Prozess verwendet.
int waitfor ()
Bewirkt, dass der aktuelle Thread bei Bedarf wartet, bis der vom Prozessobjekt dargelegte Prozess beendet wurde.
2. Beispiele mit mehreren Prozess-Programmierungen
Wenn wir Methoden in anderen Klassen in Java ausführen, unabhängig davon, ob es sich um statische oder dynamische Aufrufe handelt, werden sie im aktuellen Prozess ausgeführt, dh nur eine Java -Virtual Machine -Instanz. Manchmal müssen wir mehrere Java -Subprozesse über Java -Code starten. Obwohl dies einige Systemressourcen erfolgt, wird das Programm stabiler, da das neu gestartete Programm in verschiedenen virtuellen Maschinenprozessen ausgeführt wird.
In Java können wir zwei Methoden verwenden, um diese Anforderung zu erreichen. Der einfachste Weg ist es, die Java -Klassenname über die Exec -Methode in der Laufzeit auszuführen. Wenn die Ausführung erfolgreich ist, gibt diese Methode ein Prozessobjekt zurück. Schauen wir uns ein einfaches Beispiel unten an.
// test1.java Datei importieren java.io. ; exec ("Java test1");Nachdem ich das Programm über Java test_exec ausgeführt hatte, stellte ich fest, dass es eine zusätzliche Test1.TXT -Datei auf dem C -Laufwerk gab, aber die Ausgabeinformationen "erfolgreich" aufzurufen! Daher kann der Schluss gezogen werden, dass der Test erfolgreich durchgeführt wurde, aber aus irgendeinem Grund wird die Ausgangsinformationen des Tests in der Konsole von test_exec nicht ausgegeben. Dieser Grund ist auch sehr einfach, da der untergeordnete Prozess von test_exec mit Exec erstellt wird.
Wenn Sie die Ausgabeinformationen des untergeordneten Prozesses ausgeben möchten, können Sie den Ausgangsstrom des untergeordneten Prozesss durch GetInputStream im Prozess (Ausgabe im untergeordneten Prozess, Eingabe in den übergeordneten Prozess) erhalten und dann den Ausgangsstrom des Kindes übertragen Prozess aus der Konsolenausgabe des übergeordneten Prozesses. Der spezifische Implementierungscode lautet wie folgt:
// test_exec_out.javaimport java.io = neuer BufferputStream (P.GetInputStream ()); ;}}
Wie aus dem obigen Code ersichtlich ist, wird in test_exec_out.java die Ausgabeinformationen des untergeordneten Prozesss nach Zeile gelesen und dann wird die Ausgabe in jeder Zeile in test_exec_out durchgeführt. In der obigen Diskussion wird die Ausgabeinformationen des Kinderprozesses erhalten. Zusätzlich zu Ausgabeinformationen gibt es auch Eingabeinformationen. Da der Kinderprozess keine eigene Konsole hat, müssen auch die Eingabeinformationen vom übergeordneten Prozess bereitgestellt werden. Wir können Eingabeinformationen zum untergeordneten Prozess über die GetOutputStream -Verfahrensmethode bereitstellen (dh Eingabeinformationen vom übergeordneten Prozess zum untergeordneten Prozess, anstatt Informationen aus der Konsole einzugeben). Wir können den folgenden Code ansehen:
// test2.java Datei importieren java.io. "Informationen, die durch den übergeordneten Prozess eingegeben wurden:" + br.readline ()); .GETRUNTIME (); Flush ();
Aus dem obigen Code können wir sehen, dass Test1 die Informationen erhalten, die von test_exec_in gesendet werden und diese ausgeben. Wenn Sie nicht bw.flash () und bw.close () hinzufügen, erreichen die Informationen nicht den Kinderprozess, was bedeutet, dass der Kinderprozess in einen Blockierstatus eingeht. Da der übergeordnete Prozess beendet ist, beendet sich der Kinderprozess auch aus . Wenn Sie dies beweisen möchten, können Sie system.in.read () am Ende hinzufügen und dann den Java -Prozess über den Task -Manager (unter Windows) anzeigen, und Sie werden feststellen .CLOSE (), es gibt nur ein Java -Prozess, wenn sie entfernt werden, gibt es zwei Java -Prozesse.这是因为,如果将信息传给Test2,在得到信息后,Test2就退出了。在这里有一点需要说明一下,exec的执行是异步的,并不会因为执行的某个程序阻塞而停止执行下面的代码。 Daher kann nach dem Ausführen von Test2 der folgende Code weiterhin ausgeführt werden.
Die EXEC -Methode wurde viele Male neu geladen. Was oben verwendet wird, ist nur eine Überladung davon. Es kann auch Befehle und Parameter trennen, wie z. EXEC kann auch Java -virtuelle Maschinen mit unterschiedlichen Konfigurationen über bestimmte Umgebungsvariablen ausführen.
Neben der EXEC -Methode von Runtime zum Erstellen eines untergeordneten Prozesss können Sie auch einen Kinderprozess über ProcessBuilder erstellen. Die Verwendung von ProcessBuilder ist wie folgt:
// test_exec_out.javaimport Java.io. ;
Bei der Errichtung von untergeordneten Prozessen ähnelt ProcessBuilder der Laufzeit. Nach dem Erhalten des Prozesses sind ihre Operationen genau gleich.
Wie bei Laufzeit kann ProcessBuilder auch die Umgebungsinformationen, das Arbeitsverzeichnis usw. der ausführbaren Datei festlegen. Im folgenden Beispiel wird beschrieben, wie diese Informationen mit ProcessBuilder festgelegt werden.
ProcessBuilder pb = new ProcessBuilder("Command", "arg2", "arg2", ''');// Set environment variable Map<String, String> env = pb.environment();env.put("key1", ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::: "VALUE1"); env.remove ("key2"); Env.put ("key2", env .get ("key1") + "_test");