java 8
API
Schauen wir uns zunächst die Klasse Process
zusammen aus Java API Docs an.
** Klassenprozess ** java.lang.Object java.lang.Process
Die Methoden ProcessBuilder.start () und Runtime.exec erstellen einen nativen Prozess und geben eine Instanz einer Unterklasse von Process zurück, mit der Sie Informationen zu diesem Prozess steuern oder abrufen können. Die Process-Klasse bietet Methoden zum Eingeben aus dem Prozess, zum Ausgeben in den Prozess, zum Warten auf den Abschluss des Prozesses, zum Überprüfen des Status der Prozessbeendigung und zum Zerstören (Beenden) des Prozesses. Zum Beispiel ein nativer Fensterverarbeitungsprozess, ein Dämonprozess, ein Win16 / DOS-Prozess in einer Microsoft Windows-Umgebung oder ein Shell-Skript.
Standardmäßig verfügt der erstellte Unterprozess nicht über ein eigenes Terminal oder eine eigene Konsole. Die gesamte Verarbeitung der Standardeingabe / -ausgabe (dh Standardeingabe, Standardausgabe, Standardfehler) wird an den übergeordneten Prozess umgeleitet. Um jedoch auf diese Informationen zuzugreifen, verwenden Sie die Methoden getOutputStream (), getInputStream () und getErrorStream (). Verwenden Sie den Stream, der mit abgerufen wird. Der übergeordnete Prozess verwendet diese Streams, um Eingaben an den Unterprozess zu senden und von diesen abzurufen. Einige native Plattformen verwenden eine begrenzte Puffergröße für Standard-E / A-Streams. Wenn also ein Unterprozess keinen Eingabestream schreiben oder keine Stream-Ausgabe lesen kann, wird der Unterprozess entweder blockiert oder blockiert. Es besteht die Möglichkeit zu werden.
Bei Bedarf können Sie auch Methoden der ProcessBuilder-Klasse verwenden, um die Eingabe und Ausgabe von Unterprozessen umzuleiten.
Auch wenn kein Verweis auf das Process-Objekt vorhanden ist, wird der Unterprozess nicht beendet und weiterhin asynchron ausgeführt.
Die Ausführung des durch das Process-Objekt dargestellten Prozesses ist möglicherweise nicht asynchron oder parallel zum Java-Prozess, dem das Process-Objekt gehört.
Einige native Plattformen verwenden eine begrenzte Puffergröße für Standard-E / A-Streams. Wenn also ein Unterprozess keinen Eingabestream schreibt oder keine Streamausgabe liest, wird der Unterprozess blockiert oder blockiert. Es kann in einem Zustand sein.
Das Wichtigste, worauf Sie achten müssen, ist die Möglichkeit eines Deadlocks.
bad.java
Process p = Runtime.getRuntime().exec("cmd /c dir");
//Lässt den aktuellen Thread warten, bis der Prozess endet.
//★★★ Wenn der Standardausgabestream viel Ausgabe hat, wird der Prozess blockiert ★★★
p.waitFor();
Die Methoden ProcessBuilder.start () und Runtime.exec erstellen einen nativen Prozess und geben eine Instanz einer Unterklasse von Process zurück, mit der Sie Informationen zu diesem Prozess steuern oder abrufen können.
Es bietet eine Möglichkeit, den Prozess zu steuern und Informationen abzurufen.
Um den oben genannten Deadlock zu vermeiden, lesen Sie den Standardausgabestream und den Standardfehlerstrom aus der JVM.
getInputStream
und [ getErrorStream
](https: // docs Die Methode .oracle.com / javase / jp / 8 / docs / api / java / lang / Process.html # getErrorStream--) ist verfügbar
demo.java
try (BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
String line = null;
while ((line = br.readLine()) != null) {
//Sie müssen nicht ausgeben
}
} catch (IOException e) {
e.printStackTrace();
}
Auch wenn kein Verweis auf das Process-Objekt vorhanden ist, wird der Unterprozess nicht beendet und weiterhin asynchron ausgeführt.
Angesichts der Anweisungen in den API-Dokumenten sollte der Java GC nach Verwendung des Process-Objekts das Process-Objekt freigeben, aber es ist nur anders, es wird immer noch ausgeführt. Rufen Sie also besser die Methode destroy () auf.
bad.java
Process p = Runtime.getRuntime().exec("cmd /c dir");
// p.destroy();★★★ Endet nicht ★★★
MainTest.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
//Stichprobe
public class MainTest {
public static void main(String[] args) throws IOException, InterruptedException {
Process p = Runtime.getRuntime().exec("cmd /c cd bin && java ProcessTest");
//Ausgabestrom
new StreamThread(p.getInputStream(), "OUTPUT").start();
//Fehlerstrom
new StreamThread(p.getErrorStream(), "ERROR").start();
//Ergebnis der Prozessausführung abrufen
int result = p.waitFor();
p.destroy();
//Ausgabedaten
System.out.println("■ Ausführungsergebniscode:" + result);
}
}
//Thread streamen
class StreamThread extends Thread {
private InputStream in;
private String type;
public StreamThread(InputStream in, String type) {
this.in = in;
this.type = type;
}
@Override
public void run() {
try (BufferedReader br = new BufferedReader(new InputStreamReader(in, "MS932"))) {
String line = null;
while ((line = br.readLine()) != null) {
//Ausgabeprotokolle usw.
System.out.println(type + ">" + line);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ProcessTest.java
public class ProcessTest {
public static void main(String[] args) {
for (int i = 1; i <= 1000; i++) {
//Standardausgabe
System.out.println("Dies ist die Standardausgabe:" + i + "Wende.");
//Standart Fehler
System.err.println("Dies ist ein Standardfehler:" + i + "Wende.");
}
}
}
Recommended Posts