[Implementierung] Java Prozessklassennotizen

Ausführung

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.

Vorsichtsmaßnahmen

Sackgasse

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(); 

Strom

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();
}

Ende des Prozesses

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 ★★★

Beispielcode

Probe verarbeiten

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();
		}
	}
}

Untergeordneter Prozess zum Aufrufen (zum Testen)

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

[Implementierung] Java Prozessklassennotizen
Java Note
Java-Klassenmethoden
[Java] Klassenvererbung
Java HashMap-Klasse
Java (abstrakte Klasse)
[Java] Array-Hinweis
[Java] Verschachtelte Klasse
Anonyme Java-Klasse
Über die Java-Klasse
Java-Überprüfungsprozess
[Java] Studiennotizen
Hinweise zur Java-Serialisierung
[Java] Abstrakte Klasse
[Java] Objektklasse
Lokale Java-Klasse
Java- und Swift-Vergleich (3) Klassenimplementierung / Klassenvererbung / Klassendesign
Interpreter-Implementierung durch Java
Über die Klassenteilung (Java)
[Java] Stream Collectors Hinweis
Java-formatierte Ausgabe [Hinweis]
Informationen zur Java StringBuilder-Klasse
Überprüfen Sie die Implementierung von Java toString ()
[Java] Über Singleton Class
[Java] Hinweis zur Steuerungssyntax
Überprüfungshinweise zu Java NIO 2
Überprüfung der Java-Innenklasse
Boyer-Moore-Implementierung in Java
Feld für den Java-Klassentyp
Java-Programmierung (Klassenmethode)
Informationen zur Java String-Klasse
Implementierung der Heap-Sortierung (in Java)
Java-Programmierung (Klassenstruktur)
[Java] Grundlegende Methodenhinweise
Über die abstrakte Klasse von Java
[Java] Integer-Wrapper-Klassenreferenz
Java-Memo-Teilzeichenfolge (Standardklasse)
Java-Tipps - Modifikatoren der StataticUtility-Klasse
Java unflexibler String-Klassen-Teilstring
Versuchen Sie, mit Java zu kratzen [Hinweis]
Länge des Java-Memos (Standardklasse)
Überprüfungshinweise zum Java Collections Framework
Informationen zu Java Class Loader-Typen
Verwendung der Java-Klasse
[Java] Implementierung des Faistel-Netzwerks
[Java] Komparator der Collection-Klasse
Definition und Instanziierung von Java-Klassen
Shell zum Beenden von Java-Prozessen
[Java] Implementierungsmethode für die Timer-Verarbeitung
Java-Lernnotiz (abstrakte Klasse)
Zusammenfassung der Java Math Klasse
[Java] Was ist Klassenvererbung?
Java-Klasse Variable Klassenmethode
Externe Prozessausführung in Java
Java-Implementierung von Tri-Tree
[Java-Grundlagen] Was ist Klasse?
Mechanismus und Merkmale der in Java häufig verwendeten Collection-Implementierungsklasse
Erstellen Sie mit JAVA eine unveränderliche Klasse
Warum werden Klassenvariablen benötigt? [Java]