Java 9: Ein erster Blick

Prozess-API

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Anstatt nur Prozesse zu erzeugen und zu verwalten, können nun in Java 9 alle Prozesse unabhängig vom jeweiligen Betriebssystem mit Java-APIs verwaltet werden.

Transkript

Mit Java 9 wurden einige Änderungen an der Prozess-API vorgenommen. Wenn auch die Prozess-API bereits seit den Anfängen des Java Development Kits existiert. Im Normalfall wird sie aber dafür verwendet, um selbst Prozesse zu erzeugen und diese dann weiterhin zu verwalten. Eine Interaktion mit anderen Prozessen auf dem Betriebssystem war im Normalfall nicht möglich. Über die Zeit hinweg haben sich natürlich Entwickler verschiedene Varianten geschafft, wie es trotzdem möglich war. Im Normalfall immer über plattformspezifische Implementierungen im Java Native Interface. Mit Java 9 wird das Ganze vereinheitlicht und der sogenannte ProcessHandle eingeführt. Als Nächstes zeige ich nun also, wie Sie mit diesem ProcessHandle arbeiten können. An der Stelle habe ich nun bereits ein Projekt mit der Bezeichnung "ProcessAPI" angelegt. Außerdem gibt es hier eine Klasse, in der meine Entwicklung nun startet, mit der Bezeichnung "ProcessDemo.java". ProcessHandle ist also ein Interface, auf dem es standardmäßig einige statische Methoden gibt. Dazu gehören allProcesses(), current() und of(). Mit of() kann ich also einen bestimmten Prozess auswählen, anhand seiner Prozess-ID. Mit current() kann ich den aktuellen Prozess auswählen. Mit allProcesses() kann ich alle Prozesse sehen, die mit den Sicherheitsrechten meines Prozesses hier innerhalb der Entwicklungsumgebung übereinstimmen. Ich wähle zunächst einmal den aktuellen Prozess. In dem Fall bekomme ich also ein ProcessHandle für den aktuellen Prozess und auf diesem ProcessHandle kann ich nun diverse Dinge tun. Beispielsweise, kann ich diesen Prozess beenden; entweder ganz normal oder mit Vorsatz, also deutlich stärker, so dass der Prozess regelrecht terminiert wird. Ich kann überprüfen, ob er noch läuft oder Informationen abrufen. In dem Fall rufe ich also Informationen ab, beispielsweise über die Argumente, mit denen der Prozess gestartet wurde oder der Befehl, dem der Prozess unterliegt, also beispielsweise der .exe-Datei, mit der der Prozess gestartet wird. Bei all diesen Dingen handelt es sich um Optional Strings, da sie nicht definiert sein müssen. In meinem Fall löse ich dieses Optional nun nicht auf. Für die Ausgabe auf der Kommandozeile kann ich trotzdem noch ein Optional lesen. Ich sehe also, dass der aktuelle Prozess mein Java-Prozess ist, also der Prozess, in dem meine Klasse ausgeführt wird. Die ProcessHandle-API steht allerdings auch für die bestehende Prozess-API zur Verfügung. Ich kann also beispielsweise den "ProcessBuilder" verwenden, so wie es ihn bislang immer gab, und hier die Anwendung cmd ausführen. Als Nächstes starte ich nun diesen Prozess mit builder.start. Daraus resultiert eine Prozessinstanz "p". Um nun ein ProcessHandle daraus zu machen, kann ich mithilfe des Referenzpunktes "ProcessHandle" und processHandle() über den Prozess "p" das Handle abrufen. Ich könnte mich nun beispielsweise darüber informieren lassen, wann der Prozess beendet wird. Dafür verwende ich also mein "ProcessHandle" und den Aufruf onExit(). In dem Fall erhalte ich also ein Future. Sobald dieses Future aufgelöst wird, wurde der Prozess also beendet. Ich definiere also einen Punkt whenComplete(). Dort bekomme ich ein Handle und ein Throwable und gebe das Ganze auf der Konsole aus dass der Prozess beendet wurde. Um den Prozess nun natürlich auch zu beenden, kann ich eine Funktion auf dem ProcessHandle verwenden über processHandle.Destroy(). Da der ganze Vorgang asynchron ist, muss ich zusätzlich noch etwas Wartezeit einplanen. Dafür verwende ich thread.sleep für 5 Sekunden. Der Prozess wurde also korrekt beendet, nachdem ich ihn gestartet habe. Außerdem wurde ich darüber informiert. Spannend wird es natürlich, wenn ich mit bereits bestehenden Prozessen auf dem Betriebssystem interagiere. In meinem Fall habe ich hier nun eine Instanz von Notepad. Diese Instanz möchte ich nun beenden. Dafür muss ich sie zunächst einmal finden. Ich verwende also ProcessHandle und enummeriere alle Prozesse. Als Nächstes filtere ich diese Prozesse, bei dem jeder Prozess "p" mir nun die Information über seinen Befehl gibt. Der Befehl ist also der Name des Prozesses, beziehungsweise der Pfad zu der .exe-Datei, von der der Prozess erstellt wurde. In meinem Fall die notepad.exe Ich muss nun also überprüfen, ob sich in diesem Pfad das Wort "notepad" befindet. Auf dem Optional von command verwende ich also nun den Aufruf map und aus dem Kommando heraus überprüfe ich, ob der Text "notepad" enthalten ist. Falls dieses Optional nicht existiert, definiere ich den Ersatzwert false. Als Nächstes suche ich mir also den ersten Treffer und falls dieser Treffer überhaupt existiert, rufe ich auf dem Interface ProcessHandle::destroy auf. Wenn ich meine Applikation nun starte, wird mein Notepad-Prozess beendet. Es ist also relativ einfach mit dem Interface von ProcessHandle zu arbeiten. Mit einem Aufruf von current() bekommt man Zugriff auf den selbst aktuell gestarteten Prozess. Falls man die Prozessnummer kennt, von dem Prozess, mit dem man interagieren möchte, kann man of() verwenden. Mit allProcesses() bekommt man eine Liste aller sichtbaren Prozesse aus Sicht des eigenen Prozesses. Sobald man also ein ProcessHandle hat, kann man über info() Informationen über diesen Prozess beschaffen. Weitere sehr hilfreiche Methoden sind die Informationen über onExit oder auch das Zerstören eines Prozesses mit destroy oder destroy(Forcibly). Mit isAlive kann man zu guter Letzt noch prüfen, ob ein Prozess tatsächlich noch läuft oder nicht. Mit dem Aufruf von toHandle() auf dem ProcessBuilder kann man auch für einen selbstgestarteten Prozess ein solches Handle erzeugen.

Java 9: Ein erster Blick

Entdecken Sie die Highlights der aktuellen Java-Version.

2 Std. 14 min (21 Videos)
Derzeit sind keine Feedbacks vorhanden...
Hersteller:
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:22.08.2017

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!